2014-09-24 92 views
2
var x = { 
    name: "japan", 
    age: 20 
} 
x.prototype.mad = function() { 
    alert("USA"); 
}; 
x.mad(); 

上述代码不起作用。 对象文字不能被扩展?或者x.mad()不是正确的通话方式。扩展对象文字

回答

3

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

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

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

如果你想使用对象常量保持,只有这样,才能附加行为,你的目的是要像这样

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

myObj.foo(); 

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

0

丢掉prototype
替换:

x.prototype.mad = function() { 

有了:

x.mad = function() { 

这只是增加了一个mad属性的对象。

+0

谢谢,它的原型不适用。 – user3763367 2014-09-24 11:04:29

+0

现在我的问题是,原型不适用于使用对象字面量创建的对象吗? – user3763367 2014-09-24 11:05:31

+0

关于'prototype'是什么以及它是如何工作的解释,我建议看看** [在这个SO帖子](http://stackoverflow.com/questions/572897/how-does-javascript -prototype工作)**。 '原型'不适用于像这样的对象文字,没有。 – Cerbrus 2014-09-24 11:09:41

0

您没有.prototype可用于除function之外的任何对象。所以,你的下面的代码本身失败,错误TypeError: Cannot set property 'mad' of undefined

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

如果您需要使用的原型和扩展,你需要使用函数对象和新的关键词。如果你只是想添加属性到你的对象。直接在对象上指定它,如下所示。

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

这也适用,顺便说一句:

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

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

x.mad(); 

但随后,mad功能将任何部分反对什么那么, 文字,“下课”的情况下,也阵列(他们有typeof === "object")。 所以 - 你可能永远不会想这样使用它。我认为这值得一提,所以我添加了这个答案。