5

下面的代码被剪断会引发错误TypeError: myObj.prototype is undefined。有人可以解释我为什么吗?

为什么没有下面指定 prototype的 for & 对象文字?new Object()

var myObj = {
    a : "This is a",
    b : "This is b"
}

myObj.prototype.c= "This is c";  // TypeError: myObj.prototype is undefined

如果这不是有效的方法,那么我该如何实现呢?

4

6 回答 6

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"

现代浏览器实现Object.getPrototypeOf,这意味着您可以这样做:

var myObj = {
    a : "This is a",
    b : "This is b"
}

Object.getPrototypeOf(myObj).c= "This is c";

但是,您必须小心!如果这样做,那么现在存在的所有对象以及将来创建的所有对象都将c通过其原型链继承该属性!

这是因为myObjis 的 type Object,并且 的原型被任何类型Object的对象所继承。这将导致:

var myObj = {
    a : "This is a",
    b : "This is b"
}

Object.getPrototypeOf(myObj).c= "This is c";

var anotherObject = {};

alert(anotherObject.c); // "This is c" -- was it expected?

看到它在行动

于 2013-05-24T12:18:07.493 回答
1

您应该首先声明一个这样的自定义对象:

function myObj(){
    this.a = "a";
    this.b = "b";
}

然后您可以将“c”属性添加到该对象,如下所示

myObj.prototype.c = "c";

正如您在这里看到的http://jsfiddle.net/gwaqm/属性 c 已成功设置。

于 2013-05-24T12:19:50.020 回答
0

如果您想在创建对象后添加 c 属性,您可以这样做

myObj.c = 'This is c';
于 2013-05-24T12:22:38.817 回答
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) 虽然

于 2013-05-24T12:27:03.937 回答
0

您不能通过访问对象的原型prototype- 它只是一个称为原型的属性。__proto__您可以通过(没有 ECMA 标准!)访问原型

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
于 2013-05-24T12:28:55.103 回答
0

在您的第一个示例中,您使用 Object Literal Notation 定义具有两个属性的对象:ab.

prototypeconstructor对象有关。如果要访问对象的原型,首先要从构造函数开始:

function myClass(){
  this.a = "This is a";
}

然后你参考它的原型:

myClass.prototype.pa = "This is prototyped a";

因此,最终共享 myClass 原型的所有对象都将继承该pa成员。

于 2013-05-24T12:40:32.520 回答