8.7w+
社区成员
<script>
function person(){
this.name = "BillGates";
}
person.prototype.say = function(){alert(this.name);}
function employee(){
this.salary = 5000;
}
employee.prototype.show = function(){alert(this.salary);}
employee.prototype = new person();
var bill = new employee();
alert(bill.show);
</script>
//1
employee.prototype = {
show:function(){}
}
//2
employee.prototype = new person();
a.show = function() { ... }; // 给 a 加一个新的方法 show()
a = new person(); // 整个 a 被你换成一个新的对象; a.show 就没啦
// --------------------------
a = new person(); // a 被赋为一个新的对象
a.show = function() { ... }; // 再给 a 加一个新的方法 show(), 当然 a.show 就可以访问了
// 模拟employee的原型prototype
var pro = {}
function employee() {};
// 开始时employee原型指向的是pro对象
employee.prototype = pro;
// 原型的show方法
pro.show = function() {
alert('pro对象的show属性');
}
// 模拟个person对象
function Person() {
this.name = 'Person对象';
}
Person.prototype.say = function() {
}
// 现在employee指向的是new Person对象
employee.prototype = new Person();
var em = new employee();
try {
/**
em查找show属性的顺序. 首先找自身构造没有
就顺着__proto__链找自己的prototype原型.
但此时__proto__ = new Person了.
*/
em.show();
} catch (e) {
alert(em.name)
}
因为原型prototype本身就是个对象实例
employee.prototype.show = function(){alert(this.salary);}
可以理解为
employee.prototype = {};
employee.prototype.show = function(){alert(this.salary);}
也就是.show是属于{}对象的属性.
employee.prototype = new person();
这句话new Person也是个对象 就把prototype这个对象给覆盖了 当然他上面的属性也找不到了.
而你第二种情况是先设置new person对象. 然后show属性再加的new person对象上. 所以可以访问到