摘要:這個通過構造函數生成的對象,有一個屬性,它指向構造函數的原型對象,既訪問時,在它自身尋找該屬性,找到了,于是就返回該值。
JavaScript的面向對象與其他語言的面向對象,其實有很大的區別。
JavaScript是基于原型的面向對象系統,而傳統語言(比如java)的面向對象都是基于類的。
構造函數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();
在這個常見的構造函數寫法中,我們需要知道以下幾點:
1.Person這個函數被定義后,會自帶一個prototype屬性,這個屬性指向一個對象,既原型對象,這個對象同時有一個constructor屬性,指向Person
Person.prototype = { constructor: Person }
注意的是,所有函數都有prototype屬性,并不是只有構造函數才有。
2.cody這個通過構造函數生成的對象,有一個__proto__屬性,它指向構造函數Person的原型對象,既Person.prototype
訪問cody.name時,在它自身尋找該屬性,找到了,于是就返回該值。
訪問cody.sayName時,也是先在它自身尋找該屬性,但是無法找到,于是開始通過原型鏈向上尋找: 尋找cody.__proto__,也就是Person.prototype原型對象,發現了該屬性,于是返回這個方法。
訪問cody.toString時,在Person.prototype原型對象上也找不到,這時,繼續向上尋找,既尋找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(); // 也可以優化成這樣,減少一次父級構造函數調用 // 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是基于原型的面向對象。所以,繼承并不一定需要使用構造函數,我們可以基于一個已經存在的對象,對這個對象進行繼承。
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看起來更像是面向對象的語言,但這僅僅是語法糖而已,背后仍然是基于原型的繼承方式。
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() { // 調用父級同名方法 super.sayName(); console.log("duck sayname") } }
var duck = new Duck("duck", "red"); duck.sayColor(); duck.sayName();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93713.html
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:是完全的面向對象語言,它們通過類的形式組織函數和變量,使之不能脫離對象存在。而在基于原型的面向對象方式中,對象則是依靠構造器利用原型構造出來的。 JavaScript 函數式腳本語言特性以及其看似隨意的編寫風格,導致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向對象的語言,或者只是部分具備一些面向對象的特征。本文將回歸面向對象本意,從對語言感悟的角度闡述為什...
摘要:用代碼可以這樣描述安全到達國外面向過程既然說了面向對象,那么與之對應的就是面向過程。小結在這篇文章中,介紹了什么是面向對象和面向過程,以及中對象的含義。 這是 javascript 面向對象版塊的第一篇文章,主要講解對面向對象思想的一個理解。先說說什么是對象,其實這個還真的不好說。我們可以把自己當成一個對象,或者過年的時候相親,找對象,那么你未來的老婆也是一個對象。我們就要一些屬性,比...
摘要:之前,本質上不能算是一門面向對象的編程語言,因為它對于封裝繼承多態這些面向對象語言的特點并沒有在語言層面上提供原生的支持。所以在中出現了等關鍵字,解決了面向對象中出現了問題。 ES6之前,javascript本質上不能算是一門面向對象的編程語言,因為它對于封裝、繼承、多態這些面向對象語言的特點并沒有在語言層面上提供原生的支持。但是,它引入了原型(prototype)的概念,可以讓我們以...
閱讀 1754·2021-10-13 09:39
閱讀 1323·2019-08-30 13:58
閱讀 1415·2019-08-29 16:42
閱讀 3565·2019-08-29 15:41
閱讀 2997·2019-08-29 15:11
閱讀 2485·2019-08-29 14:10
閱讀 3414·2019-08-29 13:29
閱讀 2096·2019-08-26 13:27