Object.create的工作原理是new()没有

时间:2015-06-02 22:30:05

标签: javascript object

有这个:

sillyObject = {
    init: function init(sillySettings) {
        name = sillySettings.name
    }
};

sillyObject.showAlert = function(x) {
    return alert(x);
};

当我运行此代码时:

var sillyvar  = new sillyObject()
sillyvar.init(mySettings);
silly.showAlert("silly!");

我收到错误但是如果我使用Object.create运行相同的东西它会运行..

var sillyvar  = Object.create(sillyObject);
sillyvar.init(mySettings);
silly.showAlert("silly!");

任何(愚蠢的)帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

如果你尝试new sillyObject(),那么你得到的错误是Uncaught TypeError: object is not a function,因为sillyObject是一个对象,而不是一个函数。

This answer概述了new关键字。

Object.createnew的功能不同。它将创建一个以sillyObject为原型的新对象。

答案 1 :(得分:2)

new和Object.create是两个根本不同的东西。

new将会出现一个函数,如果没有(如你所见)它会给你一个错误。这是因为new期望调用构造函数,然后将其用作新执行上下文的基础。在该上下文期间,函数具有绑定到执行上下文范围的this。一旦函数执行完毕,它将返回this值,该值通常附加了一些数据。在您的示例中,看起来像这样:

function sillyObject() {}
sillyObject.prototype.init = function(sillySettings) {
   //perhaps you wanted to attach this name to the sillyObject?
   name = sillySettings.name;
   //which would look like this
   this.name = sillySettings.name;
   //because `this` here refers to the object context (remember?)
};
sillyObject.prototype.showAlert = function(x){
   return alert(x);//returning alert simply returns undefined (not sure why this is used here)
};

然后你可以使用new,它会使用构造函数创建执行上下文然后附加原型,你最终会得到一个新的sillyObject实例(所有实例都会有所不同)。

var sO = new sillyObject();
sO.init(mySettings);
sO.showAlert("silly!");
另一方面,

Object.create()期望一个对象作为一个参数(这就是你的版本在这里工作的原因)。它将基本上使用该对象参数作为模板创建一个新对象。或者作为MDN explains it" Object.create()方法使用指定的原型对象和属性"创建一个新对象。如果对象没有其他任何操作,这基本上会创建一个副本,这就是警报在这里工作但不在new版本中的原因。

答案 2 :(得分:0)

sillyObject是一个Object而不是一个函数。 new将创建一个新的函数实例。您可能希望使用this.prototype

var sillyObject = function () {
    this.sillySettings = {};
}

sillyObject.prototype = {
    init     : function (name) {
        this.sillySettings.name = name;
    },

    showAlert: function (x) { 
       return alert(x);
    }
};

var silly = new sillyObject(); 
silly.init('foo');
silly.showAlert('bar');

this.sillySettings不是一个功能,因此我们不会将其保留在原型中。我们可以在原型中保留initshowAlert。我们使用原型,因为在使用new时我们使用sillyObject(),所以想象变量傻被替换为sillyObject(),显示我们使用原型的原因,因为silly被实例化为函数。