JavaScript是一門基于對象的語言,所有數(shù)據(jù)類型都是對象,也就是說JavaScript中最基本的概念就是對象,而對象的核心特性就是原型。在JavaScript中,每個對象都有一個原型對象,原型對象又有自己的原型對象,構(gòu)成了原型鏈,而原型鏈的作用就是讓對象之間產(chǎn)生繼承關(guān)系。
在JavaScript中創(chuàng)建對象有多種方式,最常用的方式就是通過字面量創(chuàng)建對象。比如我們定義一個人的對象:
let person = { name: 'Tom', age: 18, sayHi: function() { console.log('Hi, my name is ' + this.name); } };
我們可以使用對象字面量的方式創(chuàng)建一個包含name、age、sayHi三個屬性的對象,其中sayHi是一個方法。但是我們想要給所有人都添加一個sayHello的方法,難道要在每個人的對象中都添加一個sayHello方法嗎?這時候就需要用到原型了。
JavaScript中的每個函數(shù)都有一個prototype屬性,這個屬性指向一個對象,即該函數(shù)的原型對象。比如我們定義一個Person函數(shù):
function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayHello = function() { console.log('Hello, my name is ' + this.name); };
通過構(gòu)造函數(shù)創(chuàng)建對象時,會自動關(guān)聯(lián)構(gòu)造函數(shù)的原型對象作為對象的原型。比如我們使用Person函數(shù)創(chuàng)建一個tom對象:
let tom = new Person('Tom', 18);
此時tom對象的原型指向Person函數(shù)的原型對象,即tom.__proto__ === Person.prototype。我們可以通過tom對象來調(diào)用sayHello方法:
tom.sayHello(); // Hello, my name is Tom
這就是原型鏈的作用,tom對象以上沒有找到sayHello方法,就會繼續(xù)往上查找原型鏈,找到Person函數(shù)的原型對象,從而調(diào)用sayHello方法。
在JavaScript中,如果我們想要判斷一個對象是否是另一個對象的實例,可以使用instanceof關(guān)鍵字。比如判斷tom對象是否是Person函數(shù)的實例:
console.log(tom instanceof Person); // true
因為tom對象的原型指向Person函數(shù)的原型對象,因此它是Person函數(shù)的一個實例。
除了用字面量和構(gòu)造函數(shù)的方式創(chuàng)建對象以外,還可以使用Object.create方法來創(chuàng)建對象。Object.create方法接收一個原型對象,并返回一個新的對象,其原型指向該原型對象。
let student = Object.create(person); student.major = 'Computer Science';
上面的代碼創(chuàng)建了一個student對象,其原型指向person對象,同時還附加了一個major屬性。因為student對象的原型指向person對象,因此也可以使用person對象中的屬性和方法。
JavaScript中的對象和原型鏈?zhǔn)欠浅V匾母拍睿瑢τ诶斫釰avaScript的面向?qū)ο缶幊谭浅S袔椭H绻胍钊肓私鈱ο蠛驮偷南嚓P(guān)內(nèi)容,建議閱讀相關(guān)的JavaScript教程書籍。