日期:2014-05-16  浏览次数:20304 次

关于原型链的一个问题这样理解不知道对不对
function SuperType(name){
this.name = name;
this.colors = ["red","blue","green"];
}

SuperType.prototype.sayName = function(){
alert(this.name);
};

function SubType (name ,age){
SuperType.call(this,name);
this.age = age;
}

SubType.prototype = new SuperType();

SubType.prototype.constructor = SubType;

SubType.prototype.sayAge = function(){
alert(this.age);
};

var instance1 = new SubType("niki",29);


这是从javascript上抄的一段代码,研究了好久,然后自己按照自己的理解画了一个图,请论坛里的前辈看看这样对不对,感觉js的继承学起来好拗口的感觉



希望论坛里的大牛看看这样对不对

------解决方案--------------------
基本是对的。

SuperType.call(this,name);这句话,会出一个问题,就是,使得SuperType的内部的属性,就是那name和age属性,

出现在SubType的内部,这里其实就是把SuperType执行了一遍。执行完之后
function SubType (name ,age){
    this.name = name;
    this.colors = ["red","blue","green"];
    this.age = age;
}

这个函数就变成这个样子了,当然后面再次使用继承,在原型链上,依然会有name和colors属性,只是内部属性有更高的优先级,所以会把原型链上的覆盖掉。

你可以确认一下,name属性,和color是属性,是不是在内部,
就是用那个,hasOwnProperty就行。
console.log(instance1.hasOwnProperty("name"));
这个方法,就可以判断,是不是在实例内部有这个属性,如果返回true,就代表实例内部存在,如果返回false则代表实例内部不存在,这个时候,要么就是存在于原型链上,要么就是不存在这个属性。

你图中,继承是对着呢,就是两个构造函数的内部属性,没有画出,我就这么说一下。