摘要:這個通過構(gòu)造函數(shù)生成的對象,有一個屬性,它指向構(gòu)造函數(shù)的原型對象,既訪問時,在它自身尋找該屬性,找到了,于是就返回該值。
JavaScript的面向?qū)ο笈c其他語言的面向?qū)ο螅鋵?shí)有很大的區(qū)別。
JavaScript是基于原型的面向?qū)ο笙到y(tǒng),而傳統(tǒng)語言(比如java)的面向?qū)ο蠖际腔陬惖摹?/p> 構(gòu)造函數(shù)
function Person(name, age, job) { this.age = age; this.name = name; this.job = job; } Person.prototype.sayName = function() { console.log(this.name); }
var cody = new Person("cody", "24", "frontend"); cody.name; cody.sayName();
在這個常見的構(gòu)造函數(shù)寫法中,我們需要知道以下幾點(diǎn):
1.Person這個函數(shù)被定義后,會自帶一個prototype屬性,這個屬性指向一個對象,既原型對象,這個對象同時有一個constructor屬性,指向Person
Person.prototype = { constructor: Person }
注意的是,所有函數(shù)都有prototype屬性,并不是只有構(gòu)造函數(shù)才有。
2.cody這個通過構(gòu)造函數(shù)生成的對象,有一個__proto__屬性,它指向構(gòu)造函數(shù)Person的原型對象,既Person.prototype
訪問cody.name時,在它自身尋找該屬性,找到了,于是就返回該值。
訪問cody.sayName時,也是先在它自身尋找該屬性,但是無法找到,于是開始通過原型鏈向上尋找: 尋找cody.__proto__,也就是Person.prototype原型對象,發(fā)現(xiàn)了該屬性,于是返回這個方法。
訪問cody.toString時,在Person.prototype原型對象上也找不到,這時,繼續(xù)向上尋找,既尋找Person.prototype.__proto__也就是Object.prototype,在它上面,可以找到toString
function Animal(name) { this.name = name; } Animal.prototype.sayName = function() { console.log(this.name); } function Duck(name, color) { Animal.call(this, name); this.color = color; } Duck.prototype = new Animal(); // 也可以優(yōu)化成這樣,減少一次父級構(gòu)造函數(shù)調(diào)用 // Duck.prototype = Object.create(Animal.prototype); Duck.prototype.constructor = Duck; Duck.prototype.sayColor = function() { console.log(this.color); }
var duck = new Duck("duck", "yellow"); duck.sayColor(); duck.sayName();
前面我們說過,JS是基于原型的面向?qū)ο蟆K裕^承并不一定需要使用構(gòu)造函數(shù),我們可以基于一個已經(jīng)存在的對象,對這個對象進(jìn)行繼承。
var obj = { name: "cody", say: function() { console.log(this.name) } }; var sub = Object.create(obj); sub.name = "deepred"; sub.say(); // deepred
Object.create的原理是:
Object.create = Object.create || function(obj) { var F = function() {}; F.prototype = obj; return new F(); }ES6的class語法
ES6引入了class語法,讓JS看起來更像是面向?qū)ο蟮恼Z言,但這僅僅是語法糖而已,背后仍然是基于原型的繼承方式。
class Animal { constructor(name) { this.name = name; } sayName() { console.log(this.name) } } class Duck extends Animal { constructor(name, color) { super(name); this.color = color; } sayColor() { console.log(this.color); } sayName() { // 調(diào)用父級同名方法 super.sayName(); console.log("duck sayname") } }
var duck = new Duck("duck", "red"); duck.sayColor(); duck.sayName();
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/93713.html
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對象存在。而在基于原型的面向?qū)ο蠓绞街校瑢ο髣t是依靠構(gòu)造器利用原型構(gòu)造出來的。 JavaScript 函數(shù)式腳本語言特性以及其看似隨意的編寫風(fēng)格,導(dǎo)致長期以來人們對這一門語言的誤解,即認(rèn)為 JavaScript 不是一門面向?qū)ο蟮恼Z言,或者只是部分具備一些面向?qū)ο蟮奶卣鳌1疚膶⒒貧w面向?qū)ο蟊疽猓瑥膶φZ言感悟的角度闡述為什...
摘要:用代碼可以這樣描述安全到達(dá)國外面向過程既然說了面向?qū)ο螅敲磁c之對應(yīng)的就是面向過程。小結(jié)在這篇文章中,介紹了什么是面向?qū)ο蠛兔嫦蜻^程,以及中對象的含義。 這是 javascript 面向?qū)ο蟀鎵K的第一篇文章,主要講解對面向?qū)ο笏枷氲囊粋€理解。先說說什么是對象,其實(shí)這個還真的不好說。我們可以把自己當(dāng)成一個對象,或者過年的時候相親,找對象,那么你未來的老婆也是一個對象。我們就要一些屬性,比...
摘要:之前,本質(zhì)上不能算是一門面向?qū)ο蟮木幊陶Z言,因?yàn)樗鼘τ诜庋b繼承多態(tài)這些面向?qū)ο笳Z言的特點(diǎn)并沒有在語言層面上提供原生的支持。所以在中出現(xiàn)了等關(guān)鍵字,解決了面向?qū)ο笾谐霈F(xiàn)了問題。 ES6之前,javascript本質(zhì)上不能算是一門面向?qū)ο蟮木幊陶Z言,因?yàn)樗鼘τ诜庋b、繼承、多態(tài)這些面向?qū)ο笳Z言的特點(diǎn)并沒有在語言層面上提供原生的支持。但是,它引入了原型(prototype)的概念,可以讓我們以...
閱讀 1752·2021-10-13 09:39
閱讀 1322·2019-08-30 13:58
閱讀 1415·2019-08-29 16:42
閱讀 3564·2019-08-29 15:41
閱讀 2996·2019-08-29 15:11
閱讀 2483·2019-08-29 14:10
閱讀 3413·2019-08-29 13:29
閱讀 2093·2019-08-26 13:27