JS继承 -- 原型链

本人是位不善言辞的羞色男孩,所以没讲很多东西,就简单的写了几段代码,要传递的信息基本都写在了注释里。



原型链

原理:通过修改prototype指向的原型对象实现属性和方法的继承。


原型链关系:(参考:原型链
原型链模型
注: 函数通过prototype属性获取原型对象,对象通过__proto__属性获取原型对象。

function B(){
	this.name = "super";
}
function A(){}
        
A.prototype = new B();
// A的原型对象 = B的实例
A.prototype.age = 12;
// 为 B的实例 添加了 age 属性

// 总结: 原型对象是父亲的实例  (按照这个例子 B的原型对象 就是 Object的实例)

原型对象是父亲的一个实例


原型字面量问题

function B(){
	this.name = "super";
}
function A(){}
        
A.prototype = new B();							// 此时 A.prototype 指向 B的实例
A.prototype = { /* 属性和方法的定义 */ };		// 此时 A.prototype 指向 Object的实例

属性共享问题

function B(){
	this.arr = [1,2];
}
function A(){}

A.prototype = new B();
var a1 = new A();
a1.arr.push(3);			// 注意,使用的是数组

// A.prototype = new B();		重新定义原型对象后 a1 和 a2 就不再指向同一个对象
var a2 = new A();
console.log(a2.arr);	// 输出:[1,2,3]

导致这个问题是因为 a1 和 a2 的原型都指向同一个 B的实例 。


传参问题
传参的问题也是一个共享的问题,这会影响到其它的对象实例。

A.prototype = new B("js");
var a1 = new A();
// A.prototype = new B("js");		只要让原型指向的不是同一个对象就不会出现相同参数的问题 (可能还会有性能的问题,和其它不足的地方)
var a2 = new A();

这个时候 a1 和 a2 指向的是同一个 B的实例,所以属性肯定也是相同的。


除了原型链以外还有其它更好的设计模式可以使用,思考这些问题也只是为了更深入的理解原型链。


版权声明:本文为qq_45940395原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。