2017-02-05 66 views
2

見原型繼承的這個代碼:原型繼承:省略構造assingment時沒有區別

var Person = function() { 
 
    this.canTalk = true; 
 
}; 
 

 
Person.prototype.greet = function() { 
 
    if (this.canTalk) { 
 
    console.log('Hi, I am ' + this.name); 
 
    } 
 
}; 
 

 
var Employee = function(name, title) { 
 
    Person.call(this); 
 
    this.name = name; 
 
    this.title = title; 
 
}; 
 

 
Employee.prototype = Object.create(Person.prototype); 
 
// Note: there's no difference, when I comment out the following line 
 
Employee.prototype.constructor = Employee; 
 

 
Employee.prototype.greet = function() { 
 
    if (this.canTalk) { 
 
    console.log('Hi, I am ' + this.name + ', the ' + this.title); 
 
    } 
 
}; 
 

 
var bob = new Employee('Bob', 'Builder'); 
 

 
bob.greet();

我得到了相同的結果(控制檯輸出),即使我註釋掉線

Employee.prototype.constructor = Employee; 

那麼什麼是值得平衡的功能原型構造函數本身。我是JS的新手。此外,如果它影響長期。 如何?我不想要任何解決方法。

+0

'(new function Foo(){})。constructor; // function Foo(){}' –

+0

[爲什麼需要設置原型構造函數?](http://stackoverflow.com/questions/8453887/why-is-it-necessary-to-set-原型構造函數) –

+1

當你重載默認原型時,你會丟失關於構造函數等的數據; 'Bar(){};''Bar.prototype = Object.create({});'現在有'(new Bar())。constructor; //函數Object(){[native code]}',即不是'Bar' –

回答

0

那麼什麼是值得均衡函數原型構造函數本身。

它有一些內在的價值和一些實際用途。首先,在派生類的原型上設置正確的構造函數,使對象對稱。這意味着,財產.constructor服務的目的是直觀地建議哪個功能創建此對象

var Person = function() {}; 
var Employee = function() {}; 

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

var bob = new Employee(); 

console.log(bob.constructor); 
console.log(bob.__proto__.constructor); 
console.log(bob.__proto__.__proto__.constructor); 
console.log(bob.__proto__.__proto__.__proto__.constructor); 

// [Function: Employee] 
// [Function: Employee] 
// [Function: Person] 
// [Function: Object] 


var Person = function() {}; 
var Employee = function() {}; 

Employee.prototype = Object.create(Person.prototype); 
// Employee.prototype.constructor = Employee; 

var bob = new Employee(); 

console.log(bob.constructor); 
console.log(bob.__proto__.constructor); 
console.log(bob.__proto__.__proto__.constructor); 
console.log(bob.__proto__.__proto__.__proto__.constructor); 

// [Function: Person] 
// [Function: Person] 
// [Function: Person] 
// [Function: Object] 

其次,如果你需要使用構造函數,你可以從.constructor參考使用它,而不是使用功能名稱。這一點在本asnwer詳細闡述:https://stackoverflow.com/a/8454111/1343488


我在JS一個新手。

我建議您訪問以下網址:http://www.javascripttutorial.net/

這是一個偉大的網站上晚自習JS概念。