繁体   English   中英

Object.create工作new()不

[英]Object.create works new() doesn't

有这个:

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!");

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

如果尝试执行new sillyObject() ,则您得到的错误是Uncaught TypeError: object is not a function因为sillyObject是对象而不是函数。

该答案很好地概述了new关键字。

Object.createnew没有做相同的事情。 它将使用sillyObject作为原型创建一个新对象。

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

new预期会跟随一个函数,如果没有,则(如您所见)它将给您一个错误。 这是因为new希望调用构造函数,然后将其用作新执行上下文的基础。 在那个上下文中,函数this绑定到执行上下文的范围。 函数执行完成后,将返回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所解释的那样 “ Object.create()方法使用指定的原型对象和属性创建一个新对象”。 如果没有对对象执行任何其他操作,这基本上会创建一个副本,这就是警报在这里起作用但在new版本中不起作用的原因。

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()因此可以想象变量silly被这个sillyObject()所替代, sillyObject()说明了为什么我们使用原型是因为silly是作为函数实例化的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM