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
就实现了 继承

浙公网安备 33010602011771号