以下代码剪切会抛出错误TypeError: myObj.prototype is undefined
。有人能解释我为什么吗?
为什么prototype
没有new Object()
&对象文字如下所示?
var myObj = {
a : "This is a",
b : "This is b"
}
myObj.prototype.c= "This is c"; // TypeError: myObj.prototype is undefined
如果这不是有效方法,那么我该如何实现呢?
答案 0 :(得分:10)
在早期版本的EcmaScript中,您无法直接访问对象的原型; prototype
属性仅存在于函数上,当它们用作构造函数时它会发挥作用。所以你可以这样做:
// This is the myObj constuctor
function myObj() {
this.a = "This is a";
this.b = "This is b";
}
// Setting a property on the constructor prototype
// All instances will share this
myObj.prototype.c= "This is c";
// Creating a new object and testing its "c" property
var obj = new myObj();
alert(obj.c); // "This is c"
Modern browsers实施Object.getPrototypeOf
,这意味着您可以执行此操作:
var myObj = {
a : "This is a",
b : "This is b"
}
Object.getPrototypeOf(myObj).c= "This is c";
但是,您必须小心!如果您这样做,那么现在存在的所有对象以及将来创建的所有对象都将继承该属性{ {1}}通过他们的原型链!
这是因为c
的类型为myObj
,Object
的原型由任何类型的对象继承。这导致:
Object
<强> See it in action 强>
答案 1 :(得分:1)
你应该首先声明一个这样的自定义对象:
function myObj(){
this.a = "a";
this.b = "b";
}
然后您可以将“c”属性添加到该对象,如下所示
myObj.prototype.c = "c";
正如您在此处http://jsfiddle.net/gwaqm/所见,属性c已成功设置。
答案 2 :(得分:0)
如果要在创建对象后添加c属性,可以执行
myObj.c = 'This is c';
答案 3 :(得分:0)
对象继承了构造函数原型的属性,而不是它们自己的原型。
您可以使用myObj.constructor.prototype。但你不应该这样做,因为({})。constructor == Object。因此,您可以修改该对象的原型,修改所有对象的原型。
要创建具有特定原型的对象:
//New method
var proto = ...
var myObj = Object.create(proto);
或强>
//Old method
var proto = ...
var constructor = function(){};
constructor.prototype = proto;
var myObj = new constructor();
你不应该使用__proto__
,因为它设计不好而且“非标准”(参见https://developer.mozilla.org/de/docs/JavaScript/Reference/Global_Objects/Object)
您可以使用Object.getPrototypeOf(obj)
答案 4 :(得分:0)
您无法通过prototype
访问对象的原型 - 它只是一个名为prototype的属性。您可以通过__proto__
(无ECMA-Standard!)
var myObj = {
a : "This is a",
b : "This is b"
}
myObj.__proto__.c= 3;
var test = {};
test.c //-> yields 3
然而,正确的(符合标准的)方法是使用:
Object.getPrototypeOf(myObj)
或
myObj.constructor.prototype
答案 5 :(得分:0)
在第一个示例中,您使用Object Literal Notation来定义具有两个属性的对象:a
和b
。
prototype
与constructor
对象相关。如果要访问对象的原型,首先要使用构造函数:
function myClass(){
this.a = "This is a";
}
然后你参考它的原型:
myClass.prototype.pa = "This is prototyped a";
因此,最终共享myClass原型的所有对象都将继承pa
成员。