js(六 ) 原型链

 

     //实例对象没有prototype 对象 有隐士原型链 __proto__ 实例对象 prototype 为undefined
      //函数 有 prototype
      //函数对象先找 自身的 属性和方法 找不到 会找 自身 prototype  自身 prototype 会向
      //上 找prototype 属性方法

 

function User(name, age) {
        this.name = name;
        this.age = age;
        this.nick = "猛人";
        this.UserSay = function () {
          console.log("user say", this.name);
        };
      }
      User.prototype.Addr = "天津";
      let user = new User("你好", 21);
      console.log("user.prototype",user.prototype)
      console.log("user.__proto__",user.__proto__)

下图可以看到 实例对象  prototype 为undefined 实例对象 有隐式 __proto__ 通过 __proto__ 查找原型对象

 

 function User(name, age) {
        this.name = name;
        this.age = age;
        this.nick = "猛人";
        this.UserSay = function () {
          console.log("user say", this.name);
        };
      }
      User.prototype.Addr = "天津";
      // let user = new User("你好", 21);
      // console.log("user.prototype",user.prototype)
      // console.log("user.__proto__",user.__proto__)
      function Soldier(name, age) {
        this.name = name;
        this.age = age;
        //改变 user this 指向 为 Soldier
        User.call(this, name, age);
      }
      Soldier.prototype = new User();
      let soldier = new Soldier("硬汉", 23);
      soldier.UserSay();
      console.log("soldier.Addr", soldier.Addr);
      console.log("soldier.name", soldier.name);
      console.log("soldier.nick", soldier.nick);
      console.log("soldier.prototype",soldier.prototype)
      console.log("soldier.__proto__.constructor",soldier.__proto__.constructor);

 

上面代码  Soldier 函数中使用了  User.call(this, name, age); 使用 call 只能 获取到User 中的属性和函数不能获取到 prototype 属性和方法

所以要获取 User.prototype.Addr 就要指定 Soldier 原型对象 所以 代码有  Soldier.prototype = new User();

即使指定了原型对象 实例的prototype 也是undefined 指定了原型对象 就可以访问 User.prototype.Addr

就实现了 继承

 

posted on 2024-09-13 15:26  是水饺不是水饺  阅读(18)  评论(0)    收藏  举报

导航