为什么Object.create使我的私有变量变为静态?

时间:2012-06-28 00:56:30

标签: javascript prototype object-create

可在此处使用代码 - 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成员。

3 个答案:

答案 0 :(得分:2)

Object.create()new用于不同目的。

您可以从现有对象使用Object.create()inherit 使用new创建对象的新instance的位置。

有关详细信息,请参阅以下问题和解答:

Understanding the difference between Object.create() and new SomeFunction()

Using "Object.create" instead of "new"

答案 1 :(得分:1)

Object.create()不会运行构造函数。但在你的例子中,构造函数是你的私人魔法发生的地方。相反,Object.create()只是简单地创建一个新对象,并将属性复制到它。

那么接下来发生的是构造函数创建一个作用域,该作用域是共享的,因为在该作用域中创建的函数会被复制。当克隆实例时,访问该范围也是如此。

答案 2 :(得分:1)

它们不是静态的,它们是“第一个”对象的实例成员。您从未为“第二个”对象创建任何新实例成员,因为您从未调用其构造函数。相反,你将“second”的原型设置为“first”,这意味着每当在“second”上访问缺少的属性时,你将从“first”获得值。

使用Object.create之后可以使用类似

之类的方法调用构造函数
Container.call(second, param);