扩展对象字面量

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

上述代码无法正常工作。对象字面量无法扩展?还是x.mad()不是正确的调用方式。
5个回答

5

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

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

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

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

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

myObj.foo(); 

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

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

0

顺便说一下,这也可以工作:

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

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

x.mad();

但是,mad函数将成为任何对象的一部分,无论是字面量、"class"实例,还是数组(它们的typeof === "object")。因此,您可能永远不想以这种方式使用它。我认为值得一提,所以我添加了这个答案。

0
丢弃原型。替换为:
x.prototype.mad = function() {

使用:

x.mad = function() {

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


现在我的问题是,使用对象字面量创建的对象是否无法使用原型? - user3763367
关于prototype是什么以及它的工作原理,我建议看一下**这篇SO文章**。但是,prototype不能像这样使用对象字面量。 - Cerbrus

0

你只能在function对象上使用.prototype,其他任何对象都不支持。因此,你的下面代码会出现错误:TypeError: Cannot set property 'mad' of undefined

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

如果您需要使用原型和扩展,您需要使用函数对象和new关键字。如果您只想向对象添加属性,请直接在对象上分配它,如下所示。
x.mad = function() {
     alert("USA");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接