javascript实现继承的核心是原型链,查找属性的时候会从prototype去查询,直到Object.prototype为止
1.对象冒充:(1)使用this给构造函数的所有属性和方法赋值,这个构造函数为classA
(2)使classA成为classB的方法
function classA(sColor) {
this.color = sColor;
this.sayColor = function() {
alert(this.color);
}
}
function classB(sColor) {}
2.原型链继承
扩展:.prototype() 方法;
用来检测对象自定义的属性,但是会忽略从原型链上继承到的属性;这个从原型链上继承的属性包括自定义的属性,也包括内置的属性;
举个例子:
var o = new Object{};
o.prototype.prop = "abc";
o.hasOwnProperty("prop"); //fasle
o.values = "abc";
o.hasOwnProperty("values"); //true;
o.hasOwnProperty("toString"); //false;
for in 循环会遍历所有的原型链上的属性,所以使用hasOwnProperty()过滤属于原型链上的属性
来自杨晨辉的理解:
原型继承的实质是重写原型对象;
每一个原型链继承是继承的主要方法,也就是说利用原型让一个引用类型继承另一个引用类型的方法和属性,每一个构造函数都有一个原型对象,原型对象有一个指向构造函数的指针,实例有一个内部指针__pro__指向该原型对象,如果原型对象等于另一个类型的实例,那么原型对象将包含指向另一个原型对象的指针,原型对象相当于另一个类型的实例的构造函数,另一个构造函数会有一个指针指向另一个原型对象,如果另一个原型对象又是另一个类型的实例,那么层层递进,就构成了实例和原型的链条,也就是js中继承的主要方式,原型链继承;