4 回答

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"]

TA貢獻1946條經驗 獲得超3個贊
Object.create
創建一個新對象,將給定對象作為其 .[[prototype]]
您在此處嘗試錯誤地繼承屬性。您正在創建具有構造函數作為其原型的對象。所有函數都有一個名為 的不可枚舉和不可寫屬性。你可以看到person2
Person
name
Object.getOwnPropertyDescriptor(Person, "name")
該線路實際上試圖覆蓋此屬性,并且不執行任何操作。也有效地成為一種功能。person2.name = "Will";
person2
在這里,正確的用法是
let person2 = Object.create(new Person());

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";

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
添加回答
舉報