Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当创建javascript对象时,是;“对象”;对象只创建了一次,并被所有对象引用';原版?_Javascript_Object_Prototype - Fatal编程技术网

当创建javascript对象时,是;“对象”;对象只创建了一次,并被所有对象引用';原版?

当创建javascript对象时,是;“对象”;对象只创建了一次,并被所有对象引用';原版?,javascript,object,prototype,Javascript,Object,Prototype,当创建javascript对象时,“Object”对象只创建一次,并且被所有的proto引用是的,首要的“Object”对象创建一次,其原型被不同的javascript(JS)对象引用,例如数组或其他创建的对象。但是,如果您创建了一个从您创建的另一个超类对象继承的对象,那么它的\uuuu proto\uuuu将首先在其原型链中引用该超类的对象原型 当您创建一个对象并调用一个方法时,JS通过原型链寻找该方法。如果JS在对象中找不到该方法,它将尝试从对象的超类中委托该方法。如果仍然找不到该方法,它将

当创建javascript对象时,“Object”对象只创建一次,并且被所有的proto引用是的,首要的“Object”对象创建一次,其原型被不同的javascript(JS)对象引用,例如数组或其他创建的对象。但是,如果您创建了一个从您创建的另一个超类对象继承的对象,那么它的
\uuuu proto\uuuu
将首先在其原型链中引用该超类的对象原型

当您创建一个对象并调用一个方法时,JS通过原型链寻找该方法。如果JS在对象中找不到该方法,它将尝试从对象的超类中委托该方法。如果仍然找不到该方法,它将向上再委托一级,并最终委托给“对象”对象。假设您创建了一个人对象作为英雄对象的超类:

let Person = function(name) {
    this.name = name;
}

Person.prototype.greet = function() {
    console.log("Hello, my name is " + this.name + ".")
}

let Hero = function(name) {
    Person.call(this, name);
}

Hero.prototype = Object.create(Person.prototype);
Hero.prototype.constructor = Hero;

Hero.prototype.fight = function(villain) {
    console.log("Hero, " + this.name + ", defeated " + villain + "!");
}
Hero.prototype=Object.create(Person.prototype)
,您允许JS将
Person.prototype
委派给
Hero.prototype
。这里,
Hero.prototype.\uuuu-proto\uuu
指向
Person.prototype
。如果在
Hero.prototype
Person.prototype
中都找不到该方法,则它最终将委托给其原型链
[[prototype]]
中的
对象.prototype
(@RobG感谢您对此进行澄清).

1)对象的
\uuuuu proto\uuuuuu
属性指示创建时将哪个对象用作原型

2) 由于
\uuuu proto\uuuu
指向一个对象,因此它是一个引用,因为在JavaScript中对象总是以引用的方式存储的

3) 使用
Object.create()
创建的新对象将有一个
\uuuu proto\uuuu
等于函数参数。因此,并非所有对象都具有相同的
\uuuuu proto\uuuu

4)
对象
是一个函数,仅定义一次

5) 对象文字具有
对象的
\uu proto\uu
。prototype
(不是
对象
):

这是因为创建对象文字与执行以下操作相同:

Object.create(Object.prototype)

是和否。其他对象引用Object.prototype(通过其
[[prototype]]
链),而不是Object。是的,多个对象可以从同一个对象继承。请注意,是的,因此请不要使用它。改用。全局对象只有一个原型属性。;-)是的,这正是我所想的,因为创建一个新对象完全违背了整个概念,但它在所有的原型教程中都被轻描淡写了。因此,所有JS原生对象都将引用“Object”对象的原型,而不是用户创建的对象。所有使用普通ECMAScript方法“由用户”创建的对象都是本机对象,并且它们的
[[prototype]]
链上都有Object.prototype。@RobG我知道
\uu proto\uuuu
是不推荐使用的。因此,
Object.create(Hero.prototype)
的使用最终是使用
\uuu proto\uuu
?这是一个坏习惯吗?(@RobG,@girvain)。另外,@RobG谢谢你指出我的错误。我将编辑我的帖子。@mikekoo不,
对象。create
根本不使用
\uuuu proto\uuuuu
getter/setter,它直接访问底层内部[[prototype]]属性,就像
对象.getPrototypeOf
对象.setPrototypeOf
对象.prototype.\uu prototype
一样。
Object.create(Object.prototype)