構造函數(shù)創(chuàng)建對象:
function Person() {
}
var person = new Person();
person.name = 'Kevin';
console.log(person.name) // Kevin
Person 就是一個構造函數(shù),我們使用 new 創(chuàng)建了一個實例對象 person
prototype
每個函數(shù)都有一個 prototype 屬性
每一個JavaScript對象(null除外)在創(chuàng)建的時候就會與之關聯(lián)另一個對象,這個對象就是我們所說的原型瘦穆,每一個對象都會從原型"繼承"屬性。
function Person() {
}
// prototype是函數(shù)才會有的屬性
Person.prototype.name = 'Kevin';
var person1 = new Person();
var person2 = new Person();
console.log(person1.name) // Kevin
console.log(person2.name) // Kevin
image
proto
每一個JavaScript對象(除了 null )都具有的一個屬性娄涩,叫proto工腋,這個屬性會指向該對象的原型
function Person() {
}
var person = new Person();
console.log(person.__proto__ === Person.prototype); // true
image
constructor
每個原型都有一個 constructor 屬性指向關聯(lián)的構造函數(shù) 實例原型指向構造函數(shù)
function Person() {
}
console.log(Person === Person.prototype.constructor); // true
image
function Person() {
}
var person = new Person();
console.log(person.__proto__ == Person.prototype) // true
console.log(Person.prototype.constructor == Person) // true
console.log(Object.getPrototypeOf(person) === Person.prototype) // true
實例與原型
function Person() {
}
Person.prototype.name = 'Kevin';
var person = new Person();
person.name = 'Daisy';
console.log(person.name) // Daisy
delete person.name;
console.log(person.name) // Kevin
但是當我們刪除了 person 的 name 屬性時写半,讀取 person.name又碌,從 person 對象中找不到 name 屬性就會從 person 的原型也就是 person.proto 九昧,也就是 Person.prototype中查找,幸運的是我們找到了 name 屬性毕匀,結(jié)果為 Kevin铸鹰。
原型與原型
var obj = new Object();
obj.name = 'Kevin'
console.log(obj.name) // Kevin
image
原型鏈
console.log(Object.prototype.__proto__ === null) // true
image
JavaScript 默認并不會復制對象的屬性,相反皂岔,JavaScript 只是在兩個對象之間創(chuàng)建一個關聯(lián)蹋笼,這樣,一個對象就可以通過委托訪問另一個對象的屬性和函數(shù),所以與其叫繼承姓建,委托的說法反而更準確些