javascript面向對象編程學習(一)javascript
每一個構造函數都有一個原型對象
prototype
,原型對象包含一個指向構造函數的指針constructor
,而實例都包含一個指向原型對象的內部指針__proto__
。咱們能夠利用它們的關係,實現原型鏈繼承!java
function Person(name) {
this.name = name;
this.names = ['大魔王']
}
Person.prototype.say = function() {
console.log('my name is ' + this.name);
}
function Child() {}
const person = new Person('大魔王');
// Child的原型對象被更改成person實例
Child.prototype = person;
Child.prototype.getName = function() {
console.log(this.name);
}
Child.prototype.getNames = function() {
console.log(this.names)
}
var child = new Child();
child.say(); // my name is 大魔王
child.getName(); // 大魔王
複製代碼
在上圖能夠看到,
構造函數Child
的原型對象prototype
被修改成person
實例,
child
實例經過__proto__
指向Child
的原型對象,即person
實例。編程
console.log(Child.prototype === person) // true
console.log(child.__proto__ === person) // true
複製代碼
使用原型建立對象會存在多個實例對引用類型的操做
會被篡改的問題,以下:函數
child.names.push('我不是大魔王');
child.getNames(); // ["大魔王", "我不是大魔王"]
var child2 = new Child();
child2.getNames(); // ["大魔王", "我不是大魔王"]
複製代碼
child
和child2
兩個實例的names
屬性指向相同,操做其中一個,另外一個也會被影響。post
有錯誤請指出,你們互相學習學習