为了账号安全,请及时绑定邮箱和手机立即绑定

使用“new”运算符创建对象的实例可以工作

使用“new”运算符创建对象的实例可以工作

喵喵时光机 2022-09-02 17:00:27
这里有点JavaScript新手。我在这里有以下2个JavaScript代码片段,它们没有达到我所期望的。这些示例使用“new”运算符在示例 #1 中创建对象“Person”的实例,并使用 ES5 Object.create() 属性在示例 #2 中创建“Person”的原型。let Person = function(name, age, city) {    this.name = name;    this.age = age;     this.city = city}// Using 'new' operator (working)let person1 = new Person("Jack Rabit", 40, "Seattle");Object.values(person1); // Shows "Jack Rabit", 40, "Seattle"但是,使用 Object.create() 属性执行以下操作...不显示属性的第一个值(在本例中为“name”):let person2 = Object.create(Person);person2.name = "Will"; person2.age=41; person2.city="San Jose";Object.values(person2); // Shows 41, "San Jose" (Does NOT show the value of the "name" property)我错过了什么?
查看完整描述

4 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

因此,通常当我使用时,我会传递一个对象以在原型中使用。您当前正在将函数作为参数传递。这种方式有效Object.create()


const Person = function(name, age, city) {

    this.name = name;

    this.age = age; 

    this.city = city

}


const person2 = Object.create(new Person());

person2.name = "Will"; 

person2.age=41; 

person2.city="San Jose";


Object.values(person2);

这可能与函数本身有自己的属性这一事实有关?但我不太确定name


编辑:


确认只是因为名称属性,将名称更改为标题以避免混淆:



const Person = function(title, age, city) {

    this.title = title;

    this.age = age; 

    this.city = city

}


const person2 = Object.create(Person);

person2.title = "Will"; 

person2.age=41; 

person2.city="San Jose";


Object.values(person2);

// ["Will", 41, "San Jose"]


查看完整回答
反对 回复 2022-09-02
?
智慧大石

TA贡献1946条经验 获得超3个赞

Object.create创建一个新对象,将给定对象作为其 .[[prototype]]

您在此处尝试错误地继承属性。您正在创建具有构造函数作为其原型的对象。所有函数都有一个名为 的不可枚举和不可写属性。你可以看到person2Personname

Object.getOwnPropertyDescriptor(Person, "name")

该线路实际上试图覆盖此属性,并且不执行任何操作。也有效地成为一种功能。person2.name = "Will";person2

在这里,正确的用法是

let person2 = Object.create(new Person());


查看完整回答
反对 回复 2022-09-02
?
开满天机

TA贡献1786条经验 获得超13个赞

Object.create 需要一个对象来创建另一个对象。因此,请使用 Person 函数返回对象。它应该看起来像这样:


 let Person = function(name, age, city) {

  return {

    name,

    age,

    city

  };

}


// Using 'new' operator (working)

let person1 = new Person("Jack Rabit", 40, "Seattle");


let person2 = Object.create(Person());

person2.name = "Will"; 

person2.age=41; 

person2.city="San Jose";


查看完整回答
反对 回复 2022-09-02
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

Object.create需要一个对象来创建另一个对象,因此虽然是一个函数(确切地说是一个函数构造函数)也是javaScript中的一个对象。因此,Object.create不会抱怨,但是当它以这种方式完成时,引擎盖下发生了什么:Person


let person2 = Object.create(Person);

person2最终被分配了一个名为“Person”的函数的一些属性(它本身不是一个函数,它不能被调用),这可以在这里看到:


// person2.name = 'Person'


// person2() Uncaught TypeError: person2 is not a function at <anonymous>:1:1

作为函数的继承属性之一,其名称是只读的,因此不会产生任何影响。Function.name MDN 文档person2.name = 'some name'


运算符将调用构造函数,构造函数将在继承构造函数的原型时返回一个对象new


查看完整回答
反对 回复 2022-09-02
  • 4 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号