可在此处使用代码 - http://jsfiddle.net/dsjbirch/zgweW/14/
这基本上是crockfords私有变量解释的直接复制和粘贴。
我添加了Object.create()
和一些跟踪。
为什么第二个对象共享第一个的私有成员?如何避免这种情况,但继续使用Object.create()
function Container(param) {
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
this.member = param;
var secret = 3;
var that = this;
this.service = function () {
return dec() ? that.member : null;
};
}
var first = new Container("private");
var second = Object.create(first);
document.write(first.service() + "<br/>");
document.write(first.service() + "<br/>");
document.write(first.service() + "<br/>");
document.write(first.service() + "<br/>");
document.write(second.service() + "<br/>");
document.write(second.service() + "<br/>");
document.write(second.service() + "<br/>");
document.write(second.service() + "<br/>");
http://jsfiddle.net/dsjbirch/zgweW/14/
我希望看到
private
private
private
null
private
private
private
null
但是,第二个对象的输出全部为空。
private
private
private
null
null
null
null
null
我总结second
是为了共享first
对象的secret
成员。
答案 0 :(得分:2)
Object.create()
和new
用于不同目的。
您可以从现有对象使用Object.create()
到inherit
使用new
创建对象的新instance
的位置。
有关详细信息,请参阅以下问题和解答:
Understanding the difference between Object.create() and new SomeFunction()
答案 1 :(得分:1)
Object.create()
不会运行构造函数。但在你的例子中,构造函数是你的私人魔法发生的地方。相反,Object.create()
只是简单地创建一个新对象,并将属性复制到它。
那么接下来发生的是构造函数创建一个作用域,该作用域是共享的,因为在该作用域中创建的函数会被复制。当克隆实例时,访问该范围也是如此。
答案 2 :(得分:1)
它们不是静态的,它们是“第一个”对象的实例成员。您从未为“第二个”对象创建任何新实例成员,因为您从未调用其构造函数。相反,你将“second”的原型设置为“first”,这意味着每当在“second”上访问缺少的属性时,你将从“first”获得值。
使用Object.create之后可以使用类似
之类的方法调用构造函数Container.call(second, param);