簡體   English   中英

JavaScript中的hasOwnProperty&Object.keys無法正常工作

[英]hasOwnProperty & Object.keys in javascript not working as expected

目的:僅繼承對象鍵,而不繼承

兩個構造函數:Person和Teacher。 教師正在使用原型繼承來繼承屬性。

身高和體重是人與老師之間繼承的兩個關鍵。

據我了解,... in遍歷對象中的所有鍵以及繼承的鍵。 因此,hasOwnProperty用於過濾僅在Teacher對象內可用的屬性。 但是,代碼輸出的所有屬性(包括身高和體重)都不應該包含。

 /* eslint-disable no-console */ function Person(first, last, age, gender, interests, weight, height) { this.name = { first, last, }; this.age = age; this.gender = gender; this.interests = interests; this.weight = weight; this.height = height; } Person.prototype.greeting = () => { console.log(`Hi! I'm ${this.name.first}.`); }; function Teacher(first, last, age, gender, interests, subject) { Person.call(this, first, last, age, gender, interests); this.subject = subject; } Teacher.prototype.greeting = () => { let prefix; if (this.gender === 'male' || this.gender === 'Male' || this.gender === 'm' || this.gender === 'M') { prefix = 'Mr.'; } else if (this.gender === 'female' || this.gender === 'Female' || this.gender === 'f' || this.gender === 'F') { prefix = 'Mrs.'; } else { prefix = 'Mx.'; } console.log(`Hello. My name is ${prefix} ${this.name.last}, and I teach ${this.subject}.`); }; Teacher.prototype = Object.create(Person.prototype); Object.defineProperty(Teacher.prototype, 'constructor', { value: Teacher, enumerable: false, // so that it does not appear in 'for in' loop writable: true, }); const teacher1 = new Teacher('Dave', 'Griffiths', 31, 'male', ['football', 'cookery'], 'mathematics'); for(var key in teacher1){ if(teacher1.hasOwnProperty(key)){ console.log(key); } } // Output: name, age, gender, interests, weight, height, subject // weight and height should not be here 

teacher1nameage等屬性自己的屬性。 他們不是從繼承teacher1的原型( Teacher.prototype )或它的原型( Person.prototype )。 盡管是“ Person來分配它們,但它們仍然是自己的屬性。 this在呼叫PersonTeacher是將被分配給對象teacher1 ,所以

this.age = age;

...使age成為teacher1 1的財產。

一旦在對象上創建了屬性,就無法知道是由哪個函數創建的。


您的代碼還有其他幾個問題:

  1. 您正在將箭頭功能分配給Teacher.prototype.greeting 不要將箭頭函數用於將要繼承的方法, this將無法正確設置。 幾個相關的問題,其答案可能有用:

  2. 您將分配給Teacher.prototype.greeting ,然后稍后完全替換Teacher.prototypeTeacher.prototype = Object.create(Person.prototype); )。 因此,您將沒有greeting方法。

  3. 如果您按Teacher.prototype 替換 Teacher.prototype上的對象, Teacher.prototype務必確保其constructor屬性正確:

     Teacher.prototype = Object.create(Person.prototype); Teacher.prototype.constructor = Teacher; // <=== 

但是 :由於您使用的ES2015 +功能呢(箭頭功能,模板文字,...),你可以讓這一切都通過使用簡單 class語法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM