繁体   English   中英

扩展对象字面量

[英]Extending object literal

var x = {
    name: "japan",
    age: 20
}
x.prototype.mad = function() {
    alert("USA");
};
x.mad();

上面的代码不起作用。 对象字面量不能扩展? x.mad()不是正确的调用方式。

你不能这样做。 为了能够使用它的prototype定义对象方法和属性,您必须将对象类型定义为构造函数,然后使用new运算符创建它的实例。

function MyObj() {}
MyObj.prototype.foo = function() { 
    // ... 
}

var myObj = new MyObj();
myObj.foo()

如果您想继续使用对象文字,将行为附加到您的对象的唯一方法是将其属性创建为匿名函数,如下所示

var myObj = { 
    foo: function() { 
       // ...
    }
}

myObj.foo(); 

后一种方式最快。 第一个是在相同类型的多个对象之间共享行为的方式,因为它们将共享相同的原型。 后一种方法为您创建的每个对象创建一个函数foo的实例。

放下prototype
代替:

x.prototype.mad = function() {

和:

x.mad = function() {

这只是向对象添加了一个mad属性。

除了函数对象之外,您没有任何可用的.prototype 因此,您的以下代码本身失败,并出现错误TypeError: Cannot set property 'mad' of undefined

x.prototype.mad = function() {
    alert("USA");
};

如果需要使用原型和扩展,则需要使用函数对象和新关键字。 如果您只想为对象添加属性。 直接在对象上分配它,如下所示。

x.mad = function() {
     alert("USA");
}

顺便说一下,这也有效:

Object.prototype.mad = function() {
    alert("USA");
}

var x = {
    name: "japan",
    age: 20
}

x.mad();

但是, mad函数将成为任何对象的一部分,文字、“类”实例以及数组(它们具有typeof === "object" )。 所以 - 你可能永远不想这样使用它。 我认为值得一提,所以我添加了这个答案。

x.constructor.prototype.mad = function() {
   alert("USA");
};
x.mad();

暂无
暂无

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

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