JavaScript 是一種基于對象的編程語言,完全基于原型的面向對象模型。JavaScript 中的對象通過原型繼承來實現,這使得原型成為開發者需要深入理解和掌握的重要主題之一。
在 JavaScript 中,每個對象都有一個原型對象,即它繼承屬性和方法的對象。對象可以通過原型鏈訪問到它的原型對象,從而繼承它的屬性和方法。原型對象也可以有它的原型對象,如此類推,形成原型鏈。
function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.getAge = function(){
return this.age;
}
var person1 = new Person("John", 24);
var person2 = new Person("Doe", 28);
console.log(person1.getAge()); //輸出:24
在上面的例子中,Person 是一個構造函數,它定義了對象的屬性和方法。構造函數的 prototype 對象包含了所有實例對象能夠訪問的屬性和方法。person1 和 person2 是 Person 的實例對象,在創建它們時,會自動繼承 Person 這個構造函數的 prototype 對象中定義的屬性和方法。
原型也可以使用字面量的形式創建。如下:
var obj = {
name : 'John',
age : 24,
getAge : function(){
return this.age;
}
};
var obj2 = Object.create(obj);
console.log(obj2.getAge()); //輸出:24
在上面這個例子中,使用 Object.create() 方法創建了一個新的對象 obj2。這個方法創建一個新對象,以 obj 作為它的原型對象。結果是 obj2 繼承了 obj 定義的所有屬性和方法,包括 getAge() 方法。
一個函數的原型對象除了繼承于 Object.prototype 外,還有以下幾個屬性:
- constructor:定義原型的構造函數。
- hasOwnProperty():判斷一個對象是否有自己的屬性,而不是繼承自它的原型對象。
- isPrototypeOf():判斷對象和原型對象之間的關系。
- propertyIsEnumerable():判斷給定屬性是否能被 for...in 語句遍歷。
- toLocaleString():返回一個對象的本地化字符串表示。
- toString():返回一個對象的字符串表示。
- valueOf():返回一個對象的原始值。
原型和構造函數以及實例之間的關系可以用如下圖示表示:
function Person(name){
this.name = name;
}
Person.prototype.getName = function(){
return this.name;
}
var person1 = new Person('John');
最后需要注意的是,每一個實例對象都不相同,它們的屬性值都是獨立的。但是,它們通過原型鏈所繼承的方法與更改了屬性值之類的東西是共享的。因此,應該小心地使用這些對象,以避免出現意外情況。