成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js 的原型 原型鏈 原型鏈的繼承

soasme / 1511人閱讀

摘要:圖片描述缺點(diǎn)是無法實(shí)現(xiàn)多繼承可以在構(gòu)造函數(shù)中,為實(shí)例添加實(shí)例屬性。

對(duì)象的方法
Object.assign()
對(duì)象可以簡寫 ,如果 key 和 value 相等則可以簡寫
let name = "xm";
let age = 2;
let obj = {
    name,
    age,
    fn(){ // 可以省略函數(shù)關(guān)鍵字和冒號(hào):
        console.log(22);
    }
}
對(duì)象新增的方法 Object.setPrototypeOf()

let o2 = {
    age: 22,
    name: "mazz"
}
let o1 = {
    name: "zz",
    __proto__: o2
    getO2Name(){
        return super.name
    }
}
// __proto__ 每一個(gè)對(duì)象上都有這個(gè)東西,如果自己家找不到 會(huì)通過這個(gè)鏈向上找
Object.setPrototypeOf(o1,o2); // 通過這個(gè)方法 把 o1 的鏈指向 o2
// super 在子對(duì)象中指向的是 __proto__對(duì)應(yīng)的內(nèi)容
// 等價(jià)于 o1.__proto__= o2;
console.log(o1.age); // 22
console.log(o1.getO2Name())
class
js 沒有類的概念,js的繼承是通過 prototype 實(shí)現(xiàn)的,每個(gè)構(gòu)造函數(shù)上都有一個(gè) prototype 屬性,指向他的原型對(duì)象,原型對(duì)象上的 constructor 指向了構(gòu)造函數(shù) ,構(gòu)造函數(shù)實(shí)例化后有一個(gè)proto 指向原型對(duì)象 原型對(duì)象的 constructor 指向構(gòu)造函數(shù) 就實(shí)現(xiàn)了 繼承

1.原型鏈?zhǔn)窃趺磳?shí)現(xiàn)繼承的?
2.可以圍繞構(gòu)造函數(shù)說一下的?
3.構(gòu)造函數(shù)實(shí)例化后是怎么繼承構(gòu)造函數(shù)的屬性
4.怎么向原型對(duì)象上添加屬性

function Person (){} //聲明一個(gè)函數(shù) js中 函數(shù)是對(duì)象 也是構(gòu)造函數(shù)
console.log(Person.prototype); // Person 對(duì)象的原型
// 由此打印出來的結(jié)果 可以看出 Person對(duì)象的原型上有 一個(gè)constructor 屬性, 它指向 Person 的構(gòu)造函數(shù) 也就是Person本身 還有一個(gè)__proto__屬性
 function Person(name) {
     this.name = name; // 私有的
 }
 Person.prototype.eating = function() {//給對(duì)象的原型對(duì)象上添加一個(gè)eating 的方法 ,new 出來的實(shí)例 都會(huì)共享此方法的
     console.log("eat food")
 }
 Person.prototype.age = 12;// 給對(duì)象的原型對(duì)象上 添加一個(gè)age 屬性
    var p1 = new Person("blob");
   var p2 = new Person("lisa");
console.log(p1.age,p2.age); // 12,12
console.log(p1.eating(),p2.eating()); // eat food eat food
![圖片描述][1]
// 所以只要是Person的對(duì)象 他們都會(huì)共享原型對(duì)象上的方法和屬性的
**WHY?? 這個(gè)實(shí)例 能夠訪問 原型對(duì)象上的方法及屬性的 **
  //其實(shí) p1 的實(shí)例上有一個(gè)指針,這個(gè)指針指向 構(gòu)造函數(shù)的原型對(duì)象(通俗點(diǎn) 也就是所屬類的原型)此時(shí)原型對(duì)象中的方法及屬性自然也就能訪問到的

總結(jié)下 構(gòu)造函數(shù) 原型 和實(shí)例的關(guān)系:

每一個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象(prototype) 原型對(duì)象上 擁有一個(gè)指向構(gòu)造函數(shù)的指針(constructor)

實(shí)例上擁有一個(gè)指向原型對(duì)象的指針 即 proto

類 以前就是構(gòu)造函數(shù) 分為私有和公有

 function Parent () {
    this.name = "maz"; // 當(dāng)前parent的私有的屬性 實(shí)例上自己調(diào)用的
  }
// new 出來的實(shí)例可以調(diào)用原型上的方法
Parent.prototype.coding = function(){  // 公有的 別人繼承了 都可以用的
    console.log("有思想的coding");
}

function Child () {
}

Child.prototype = new Parent() // 核心 主要就是 子類的原型指向 父類的實(shí)例
let c = new Child();
console.log(c.constructor); // Parent
console.log(c.name,c.coding()); //拿到 公有方法和私有屬性

原型鏈繼承的一種基本模式 其原理就是 對(duì)象的實(shí)例 擁有一個(gè)指向原型對(duì)象的指針(指向所屬類的原型)Child 的 原型對(duì)象擁有了 Parent 的實(shí)例后,自然也擁有了一個(gè)指向 Parent 原型對(duì)象的指針了。此時(shí) 我們 new 一個(gè) Child 的實(shí)例 c 時(shí),c 實(shí)例包含著一個(gè)指向Child 原型的指針, Child.prototype 擁有一個(gè)指向 Parent 原型對(duì)象的指針,Parent 原型本身包含著一個(gè)指向自身構(gòu)造函數(shù)的指針,這樣一來,就構(gòu)成了實(shí)例與原型的鏈條,也就是所謂的原型鏈的概念了
**注意**:這里的c對(duì)象的 constructor 現(xiàn)在指向了 Parent 了,因?yàn)?Child 的原型指向了 另外一個(gè)對(duì)象 Parent 的原型,而這個(gè)原型對(duì)象的 constructor 指向的是 Parent。
![圖片描述][2]


缺點(diǎn)是:
1. 無法實(shí)現(xiàn)多繼承
2. 可以在Child 構(gòu)造函數(shù)中,為Child實(shí)例添加實(shí)例屬性 。如果要新增 原型屬性或者方法的話 則必須放在 new Child() 實(shí)例化之后執(zhí)行。
3.來自原型對(duì)象的所有屬性被所有的實(shí)例共享
4.創(chuàng)建子類實(shí)例時(shí),無法向父類構(gòu)造函數(shù)傳參

// 一般就不用 上面 這種方式了
// Object.Create()  // 只是繼承公有方法
Parent.fn = funciton (){ //屬于Parent 類上的私有屬性

}
![圖片描述][3]
function create(parentProto,param){
    function Fn(){} // 相當(dāng)于構(gòu)建一個(gè)類 類的原型鏈指向了父類的原型
    Fn.prototype = parentProto;
    let fn = new Fn();
    fn.constructor = param.constructor.value; // 手動(dòng)改變constructor的指向
    return fn;
}
// 子類查找時(shí) 可以查到父類的原型,所以可以拿到父類的公共方法
Child.prototype =create(Parent.prototype);
let child = new Child();
console.log(child.coding())
console.log(child.constructor);// Parent
**希望這里的constructor是Child 怎么實(shí)現(xiàn)呢?**
Child.prototype =create(Parent.prototype,{constructor:{ value: Child }})
let child = new Child;
console.log(child.constructor);// Child
//靜態(tài)屬性 是可以繼承的
Child.__proto__ = Parent;
Child.fn();

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105814.html

相關(guān)文章

  • JS面向?qū)ο?em>的程序設(shè)計(jì)之繼承實(shí)現(xiàn) - 原型注意點(diǎn)

    摘要:第一種方式是使用操作符,只要檢測的實(shí)例對(duì)象中的原型鏈包含出現(xiàn)過的構(gòu)造函數(shù),結(jié)果就會(huì)返回。而這也正是組合使用原型模式和構(gòu)造函數(shù)模式的原因。在構(gòu)造函數(shù)模式中定義屬性,在原型模式中定義共享的方法。 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯(cuò)誤,會(huì)非常感謝您的指出。文中絕大部分內(nèi)容引用自《Ja...

    pf_miles 評(píng)論0 收藏0
  • 如何理解JavaScript原型原型?

    摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關(guān)系那么圖中所有的虛線將構(gòu)成一個(gè)繼承層級(jí),而實(shí)線表示屬性引用。原型鏈?zhǔn)菍?shí)現(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個(gè)問題,在面試中,很多同學(xué)經(jīng)常都會(huì)遇到。這里給大家講講,方便大家記憶。 JavaScript的特點(diǎn)JavaScript是一門直譯式腳本...

    xuexiangjys 評(píng)論0 收藏0
  • 如何理解JavaScript原型原型?

    摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關(guān)系那么圖中所有的虛線將構(gòu)成一個(gè)繼承層級(jí),而實(shí)線表示屬性引用。原型鏈?zhǔn)菍?shí)現(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個(gè)問題,在面試中,很多同學(xué)經(jīng)常都會(huì)遇到。這里給大家講講,方便大家記憶。 JavaScript的特點(diǎn)JavaScript是一門直譯式腳本...

    adie 評(píng)論0 收藏0
  • JS面向?qū)ο?em>的程序設(shè)計(jì)之繼承實(shí)現(xiàn) - 原型

    摘要:簡單回顧一下構(gòu)造函數(shù)原型和實(shí)例對(duì)象之間的關(guān)系每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象。找到生成構(gòu)造函數(shù)的原型對(duì)象的構(gòu)造函數(shù),搜索其原型對(duì)象,找到了。 JS面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承的實(shí)現(xiàn) - 原型鏈 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯(cuò)誤,會(huì)非常感謝您的指出。文中絕大部分內(nèi)容引用自《JavaS...

    zhaochunqi 評(píng)論0 收藏0
  • 理解js原型繼承

    摘要:相當(dāng)于在用原型繼承編寫復(fù)雜代碼前理解原型繼承模型十分重要。同時(shí),還要清楚代碼中原型鏈的長度,并在必要時(shí)結(jié)束原型鏈,以避免可能存在的性能問題。 js是一門動(dòng)態(tài)語言,js沒有類的概念,ES6 新增了class 關(guān)鍵字,但只是語法糖,JavaScript 仍舊是基于原型。 至于繼承,js的繼承與java這種傳統(tǒng)的繼承不一樣.js是基于原型鏈的繼承. 在javascript里面,每個(gè)對(duì)象都有一...

    wthee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<