我正在学习 JS Prototype。
如果我从其他构造函数(B)的实例设置构造函数(A)的原型,那么(B)实例是否会在 A 中引入共享属性?
示例 1
function A(){
var private = '';
this.getPrivate = function(){
return private
};
this.setPrivate = function(_private){
private = _private;
};
}
function B(){};
B.prototype = new A();
b1 = new B();
b2 = new B();
b1.setPrivate(new Date());
b2.getPrivate(); // Here `private` is behaving as singleton property. Why?
示例 2
function A(){
var private = '';
}
A.prototype.getPrivate = function(){
return this.private
};
A.prototype.setPrivate = function(_private){
this.private = _private;
};
function B(){};
B.prototype = new A();
b1 = new B();
b2 = new B();
b1.setPrivate(new Date());
b2.getPrivate(); // This time private is not singleton property.
我在玩它时发现了原型的这个新方面。
- 在示例 1 中,为什么
private
在 的不同实例之间共享属性B
? - 在示例 2 中,为什么
private
财产在两种情况下都具有独立存在?但是原始属性没有改变,但是 getter/setter 是通过原型定义的。 - 可以将示例 1 视为单例属性的实现吗?
- 通过实例进行原型设计和通过原型进行原型设计,有什么区别?例如
B.prototype = new A();
B.prototype = (new A()).constructor.prototype
- 原型设计的全部秘密是什么?