0

如果我有以下代码,为什么它会返回一个错误,说 Cannot set property 'second_prop' of undefined 。我认为您可以扩展原型属性并为对象原型添加更多变量和方法。既然两个console语句都返回'Object'和true,那为什么返回undefined的错误。我的想法是,如果“obj”是 Object 类型的对象,那么我应该能够做 temp.prototype.newproperty?因此,对象将具有“新属性”。但我显然错了,所以我在这里遗漏了一些东西。更重要的是,当 obj 已经是对象文字时,为什么我需要执行 Object.create() ?不是已经是对象了吗?我只是在看一些例子并试图理解这一点

    var obj = {
        first_property: 'first property'
    }
    console.log(typeof obj);
    console.log(obj instanceof Object);

    var temp = Object.create(obj);
    temp.prototype.second_prop = 'second property'

输出

//object
//true
//Uncaught TypeError: Cannot set property 'second_prop' of undefined

那么,为什么我不能做 temp.prototype 或 obj.prototype?

4

3 回答 3

2

如果我有以下代码,为什么它会返回一个错误,说无法设置未定义的属性 'second_prop'

Javascript 文字对象已经是实例化的对象,并且没有.prototype属性。该属性位于构造函数上,而不是已经实例化的对象。在任何当前浏览器 (IE9+) 中,您都可以使用Object.getPrototypeOf()来获取已构建对象的原型。

但是,这听起来更像是您宁愿克隆一个对象,然后向克隆添加属性。或者,如果您希望两个对象具有相同的附加属性,则添加该属性,然后克隆它。或者,如果您只想使用您的文字对象,那么就按原样使用它。

一旦一个对象已经被构建,原型就是一个内部属性,通常并不意味着你会弄乱它。如果您打算更改所有对象的原型,则应该更改构造函数的原型。如果您只想更改对象的这个实例的属性,那么只需更改对象本身的属性,而不是原型。

与往常一样,如果您描述了您实际想要完成的任务(而不是为什么您自己的解决方案没有达到您的预期),我们可以为您提供更好的帮助。

我认为您可以扩展原型属性并为对象原型添加更多变量和方法。

您可以,但该.prototype属性位于构造函数上,而不是已构建的对象上。

既然两个console语句都返回'Object'和true,那为什么返回undefined的错误。我的想法是,如果“obj”是 Object 类型的对象,那么我应该能够做 temp.prototype.newproperty?

您将作为实例化对象与作为具有原型的构造函数混淆。实例化对象具有原型作为内部属性,而不是公共.prototype属性。因此,当某些东西报告 instanceof 时,这意味着它实际上是该类型对象的实例(因此在其内部原型链中具有该类型的对象原型),而不是具有公共.prototype属性的构造函数。

更重要的是,当 obj 已经是对象文字时,为什么我需要执行 Object.create() ?不是已经是对象了吗?

的目的Object.create()是创建一个新对象,使用现有对象作为原型。如果您被声明为 Javascript 文字并且您只想将文字本身用作对象,那么没有理由使用Object.create()它。只需将文字用作已构建的对象即可。

于 2015-04-30T21:18:54.480 回答
0

.prototype 是一个并不总是与对象的实际原型相关联的属性。真正的原型可以通过.__proto__

var obj = {
    first_property: 'first property'
}
console.log(typeof obj);
console.log(obj instanceof Object);

var temp = Object.create(obj);

temp.__proto__.second_prop = 'second property';

console.log(Object.getPrototypeOf(temp));

//{ first_property: 'first property',
//second_prop: 'second property' }
于 2015-04-30T21:36:39.363 回答
0

temp没有原型。对象有一个原型。您可以通过调用更改所有对象的原型,Object.prototype但不能仅更改一次对象。

于 2015-04-30T21:19:15.073 回答