摘要:對(duì)象創(chuàng)建的三種方式字面量創(chuàng)建方式系統(tǒng)內(nèi)置構(gòu)造函數(shù)方式自定義構(gòu)造函數(shù)構(gòu)造函數(shù)原型實(shí)例之間的關(guān)系實(shí)例是由構(gòu)造函數(shù)實(shí)例化創(chuàng)建的,每個(gè)函數(shù)在被創(chuàng)建的時(shí)候,都會(huì)默認(rèn)有一個(gè)對(duì)象。
JS 對(duì)象創(chuàng)建的三種方式
//字面量創(chuàng)建方式 var person= { name:"jack" } //系統(tǒng)內(nèi)置構(gòu)造函數(shù)方式 var person= new Object(); person.name = "jack"; //自定義構(gòu)造函數(shù) function Person(name){ this.name = name; } var person = new Person("jack");JS 構(gòu)造函數(shù)、原型、實(shí)例之間的關(guān)系
實(shí)例是由構(gòu)造函數(shù)實(shí)例化創(chuàng)建的,每個(gè)函數(shù)在被創(chuàng)建的時(shí)候,都會(huì)默認(rèn)有一個(gè)prototype對(duì)象。該對(duì)象就是構(gòu)造函數(shù)的原型,并且原型對(duì)象中還有一個(gè)constructor屬性,指向的是原型所在的構(gòu)造函數(shù)。
在每一個(gè)實(shí)例對(duì)象中的__proto__中同時(shí)有一個(gè) constructor 屬性,該屬性指向創(chuàng)建該實(shí)例的構(gòu)造函數(shù)。
構(gòu)造函數(shù)的 prototype對(duì)象默認(rèn)都有一個(gè) constructor 屬性,指向 prototype 對(duì)象所在函數(shù)。
(圖片原址:https://www.oecom.cn/the-rela...)
值類型成員或者引用類型成員寫(xiě)入(實(shí)例對(duì)象.成員 = xx):
當(dāng)實(shí)例期望重寫(xiě)原型對(duì)象中的某個(gè)普通數(shù)據(jù)成員時(shí)實(shí)際上會(huì)把該成員添加到自己身上,
也就是說(shuō)該行為實(shí)際上會(huì)屏蔽掉對(duì)原型對(duì)象成員的訪問(wèn)
JS 構(gòu)造函數(shù)常用用法復(fù)雜類型修改(實(shí)例對(duì)象.成員.xx = xx):
同樣會(huì)先在自己身上找該成員,如果自己身上找到則直接修改,
如果自己身上找不到,則沿著原型鏈繼續(xù)查找,如果找到則修改,
如果一直到原型鏈的末端還沒(méi)有找到該成員,則報(bào)錯(cuò)(實(shí)例對(duì)象.undefined.xx = xx)。
function Person( name,age,job){ this.name = name; this.age = age; this.job = job; } Person.prototype = { constructor:Person, //修正,指向正確的構(gòu)造函數(shù) introduce:function(){ console.log("hello,everybody. my name is"+ this.name +" ") } }
不需要共享的數(shù)據(jù)寫(xiě)在構(gòu)造函數(shù)中,需要共享的數(shù)據(jù)寫(xiě)在原型中。
實(shí)例對(duì)象使用的屬性或者方法,先在實(shí)例中查找,找到了則直接使用,找不到則,去實(shí)例對(duì)象的__proto__指向的原型對(duì)象prototype中找,找到了則使用,找不到則報(bào)錯(cuò)。
原型鏈:是一種關(guān)系,實(shí)例對(duì)象和原型對(duì)象之間的關(guān)系,關(guān)系是通過(guò)原型(__proto__)來(lái)聯(lián)系的
JS 封裝、繼承、多態(tài)面向?qū)ο蟮木幊陶Z(yǔ)言中有類的概念,而JS是基于對(duì)象的語(yǔ)言,JS中沒(méi)有類,但是JS可以模擬面向?qū)ο蟮乃枷刖幊?,JS通過(guò)構(gòu)造函數(shù)模擬類的概念。
封裝:一系列屬性放在對(duì)象中或者一系列實(shí)現(xiàn)某種功能的方法放在對(duì)象,就是封裝。JS 繼承方式 借用構(gòu)造函數(shù)繼承:構(gòu)造函數(shù)的名字.call( 當(dāng)前對(duì)象,屬性,屬性....)
繼承:繼承屬于類與類之間的關(guān)系,JS通過(guò)構(gòu)造函數(shù)模擬類,通過(guò)原型來(lái)實(shí)現(xiàn)繼承,繼承的目的是為了實(shí)現(xiàn)數(shù)據(jù)共享。
多態(tài):一個(gè)對(duì)象有不同的行為,或者同一個(gè)行為針對(duì)不同的對(duì)象,產(chǎn)生不同的結(jié)果,要想有多態(tài),就要先有繼承,JS中可以模擬多態(tài)。
解決了屬性繼承問(wèn)題,但是不能繼承父級(jí)的方法?! ?/p>
function Person(name,age){ this.name = name; this.age = age; } function Student(name,age,score) { Person.call(this,name,age); this.score = score; } var Ming = new Student("小明","18","100");組合繼承:原型繼承 + 借用構(gòu)造函數(shù)繼承
function Person(name,age){ this.name = name; this.age = age; } Person.prototype.introduce = function(){ console.log("hello,everybody,my name is " + this.name); } function Student(name,age,score) { Person.call(this,name,age); this.score = score; } Student.prototype = new Person(); var Ming = new Student("小明","18","100");寄生組合繼承:寄生式繼承 + 借用構(gòu)造函數(shù)繼承
function inheritObject(o){ function F(){}; F.prototype = o; return new F(); } function inheritPrototype(subclass,superclass){ var p = inheritObject(superclass.prototype); p.constructor = subclass; subclass.prototype = p; } //定義父類 function SuperClass(name){ this.name = name; this.colors = [red,blue] } SuperClass.prototype.getName = function(){ console.log(this.name); } //定義子類 function SubClass(name,time){ //構(gòu)造函數(shù)式繼承 SuperClass.call(this,name); this.time = time; } //寄生式繼承父類原型 inheritPrototype(SubClass,SuperClass); //子類新增原型方法 SubClass.prototype.getTime = function(){ console.log(this.time); }模擬多繼承:
Object.prototype.mix = function(){ var i = 0, //從第一個(gè)參數(shù)起為被繼承對(duì)象 len = arguments.length, //獲取參數(shù)長(zhǎng)度 arg; //緩存參數(shù)對(duì)象 for(;i < len; i++){ //緩存當(dāng)前對(duì)象 arg = arguments[i]; for(var property in arg){ this[property] = arg[property]; } } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108957.html
摘要:就是通過(guò)調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。構(gòu)造函數(shù)模式可以創(chuàng)建自定義引用類型,可以像創(chuàng)建內(nèi)置對(duì)象實(shí)例一樣使用操作符。 數(shù)據(jù)類型: 簡(jiǎn)單數(shù)據(jù)類型:Undefined、Null、String、Number、Boolean、Symbol 復(fù)雜數(shù)據(jù)類型:Object // Undefined:聲明,但未初始化 // Null:空對(duì)象指針 typeof操作符(檢測(cè)基本數(shù)據(jù)類型): ...
摘要:繼承了如上,我們通過(guò)方法借調(diào)了超類的構(gòu)造函數(shù),實(shí)際上是在新創(chuàng)建的實(shí)力環(huán)境下調(diào)用了構(gòu)造函數(shù)。組合繼承組合繼承的基本思想將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合到一塊,從而發(fā)揮二者之長(zhǎng)的一種繼承模式。繼承方法在上面這個(gè)例子中,構(gòu)造函數(shù)定義了兩個(gè)屬性和。 在ECMAScript中只支持實(shí)現(xiàn)繼承,而且實(shí)現(xiàn)繼承主要是依靠原型鏈來(lái)實(shí)現(xiàn)的。 1. 什么是原型鏈 繼承基本思想:利用原型讓一個(gè)引用類型繼承另一個(gè)...
摘要:對(duì)象詳解對(duì)象深度剖析,深度理解對(duì)象這算是醞釀很久的一篇文章了。用空構(gòu)造函數(shù)設(shè)置類名每個(gè)對(duì)象都共享相同屬性每個(gè)對(duì)象共享一個(gè)方法版本,省內(nèi)存。 js對(duì)象詳解(JavaScript對(duì)象深度剖析,深度理解js對(duì)象) 這算是醞釀很久的一篇文章了。 JavaScript作為一個(gè)基于對(duì)象(沒(méi)有類的概念)的語(yǔ)言,從入門(mén)到精通到放棄一直會(huì)被對(duì)象這個(gè)問(wèn)題圍繞。 平時(shí)發(fā)的文章基本都是開(kāi)發(fā)中遇到的問(wèn)題和對(duì)...
摘要:中又兩種屬性數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位置叫做數(shù)據(jù)屬性和訪問(wèn)器屬性和就是訪問(wèn)器屬性數(shù)據(jù)屬性而數(shù)據(jù)屬性又有四個(gè)這樣的特性是否可配置編輯刪除屬性默認(rèn)是否可以被枚舉即可被默認(rèn)是否可寫(xiě)默認(rèn)寫(xiě)不代表刪除這里僅限修改屬性的數(shù)據(jù)值默認(rèn)是設(shè)置了一個(gè)空對(duì)象定 ECMAScript 中又兩種屬性:數(shù)據(jù)屬性(包含一個(gè)數(shù)據(jù)值的位置叫做數(shù)據(jù)屬性)和訪問(wèn)器屬性(getter() 和 setter()就是訪問(wèn)器屬性)...
摘要:搞清了構(gòu)造函數(shù)和原型的區(qū)別后,就可以繼續(xù)了。指向構(gòu)造函數(shù)的原型對(duì)象,存在于實(shí)例與構(gòu)造函數(shù)的原型對(duì)象之間。要注意的是當(dāng)我們使用下面這種將整個(gè)重寫(xiě)的情況時(shí),會(huì)切斷構(gòu)造函數(shù)和原型之間的聯(lián)系,也就是說(shuō)不再指向了,而是指向。 前言 先說(shuō)一說(shuō)為什么要搞清楚JavaScript的原型,因?yàn)檫@就是JS的根。JavaScript雖然不是一門(mén)傳統(tǒng)的面向?qū)ο笳Z(yǔ)言,但它有自己的類和繼承機(jī)制,最重要的就是它采用...
閱讀 2410·2019-08-30 15:56
閱讀 1067·2019-08-30 15:55
閱讀 3231·2019-08-30 15:44
閱讀 965·2019-08-30 10:53
閱讀 1916·2019-08-29 16:33
閱讀 2558·2019-08-29 16:13
閱讀 740·2019-08-29 12:41
閱讀 907·2019-08-26 13:56