構造函數創建對象:
function Person() { } var person = new Person(); person.name = 'Tian'; console.log(person.name); //Tian
Person 就是一個構造函數,使用 new 創建了一個實例對象 person
prototype
每個函數都有一個 prototype 屬性
每一個 javaScript 對象(null除外)在創建的時候就會與之關聯另一個對象,這個對象就是我們所說的原型,每一個對象都會從原型“繼承”屬性。
function Person() { } //protoType是函數才會有的屬性 Person.prototype.name = 'Tian'; var person1 = new Person(); var person2 = new Person(); console.log(person1.name); //Tian console.log(person2.name); //Tian
proto
每一個 javaScript 對象(null除外)都具有的一個屬性叫 proto ,這個屬性會指向該對象的原型
function Person() { } var person = new Person(); console.log(person.__proto__ === Person.prototype); //true
constructor
每一個原型都有一個 constructor 屬性指向關聯的構造函數,實例原型指向構造函數
function Person() { } console.log(Person === Person.prototype.constructor); //true
function Person() { } var person = new Person(); console.log(person.__proto__ === Person.prototype); //true console.log(Person.prototype.constructor === Person); //true cosnole.log(Object.getPrototypeOf(person) === Person.prototype); //true
實例與原型
function Person() { } Person.prototype.name = 'Tian'; var person = new Person(); person.name = 'Anni'; console.log(person.name); //Anni delete person.name; console.log(person.name); //Tian
在這個例子中,我們給實例對象 person 添加了 name 屬性,當我們打印 person.name 的時候,結果自然為 Anni。
但是當我們刪除了 person 的 name 屬性時,讀取 person.name,從 person 對象中找不到 name 屬性就會從 person 的原型也就是 person.proto ,也就是 Person.prototype中查找,幸運的是我們找到了 name 屬性,結果為 Tian。
原型與原型
var obj = new Object(); obj.name = 'Tian'; console.log(obj.name); //Tian
原型鏈
javaScript 默認並不會復制對象的屬性,相反,JavaScript只是在倆個對象之間創建一個關聯,這樣一個對象就可以通過委托訪問另一個對象的屬性和函數,所以與其叫繼承,委托的說法更准確些。