本人是位不善言辞的羞色男孩,所以没讲很多东西,就简单的写了几段代码,要传递的信息基本都写在了注释里。
- 参考:
原型链
原型链
原理:通过修改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版权协议,转载请附上原文出处链接和本声明。