国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript...原型與繼承中的原型鏈...

MiracleWong / 3400人閱讀

摘要:原型原型是什么在中函數(shù)是一個(gè)包含屬性和方法的類型的對(duì)象而原型就是類型對(duì)象的一個(gè)屬性在函數(shù)定義時(shí)就包含了屬性它的初始值是一個(gè)空對(duì)象在中并沒有定義函數(shù)的原型類型所以原型可以是任何類型原型是用于保存對(duì)象的共享屬性和方法的原型的屬性和方法并不會(huì)影響

原型 原型是什么

在JavaScript中 函數(shù)是一個(gè)包含屬性和方法的Function類型的對(duì)象 而原型(Prototype)就是Function類型對(duì)象的一個(gè)屬性
在函數(shù)定義時(shí)就包含了prototype屬性 它的初始值是一個(gè)空對(duì)象 在JavaScript中并沒有定義函數(shù)的原型類型 所以原型可以是任何類型
原型是用于保存對(duì)象的共享屬性和方法的 原型的屬性和方法并不會(huì)影響函數(shù)本身的屬性和方法

// Function類型的屬性 -> 所有函數(shù)都具有的屬性
console.log(Function.prototype);
// 定義函數(shù)
function fn(){
    console.log("this is function");
}
// 原型的默認(rèn)值是空對(duì)象
console.log(fn.prototype);
// 函數(shù)包含構(gòu)造函數(shù) -> 所有引用類型其實(shí)都是構(gòu)造函數(shù)
console.log(Number.prototype);

console.log(Object.prototype);

var result = Object.getOwnPropertyDescriptor(Object.prototype, "constructor");
console.log(result);
獲取原型
function fn(){
    console.log("this is function");
}
// 使用訪問對(duì)象的屬性語法結(jié)構(gòu)
console.log(fn.prototype);
console.log(fn["prototype"]);
// Object類型提供getPrototypeOf()方法
console.log(Object.getPrototypeOf(fn));
為原型新增屬性或者方法
function fn(){
    console.log("this is function");
}
// 變量proto也是一個(gè)空對(duì)象
// var proto = fn.prototype;

// 新增屬性或方法
// proto.name = "張三";
fn.prototype.name = "張三";
console.log(fn.prototype);
// defineProperty()
Object.defineProperty(fn.prototype, "age", {
    value : 28,
    enumerable : true
});
console.log(fn.prototype);
構(gòu)造函數(shù)的原型
// 定義構(gòu)造函數(shù)
function Hero(){
    this.name = "張三";
    this.sayMe = function(){
        console.log("this is function");
    }
}
// 操作構(gòu)造函數(shù)Hero的原型
Hero.prototype.age = 28;
// 利用構(gòu)造函數(shù)來創(chuàng)建對(duì)象
var hero = new Hero();
console.log(hero);
// 為構(gòu)造函數(shù)的原型新增的屬性 -> 構(gòu)造函數(shù)創(chuàng)建的對(duì)象中依舊可以訪問
console.log(hero.age);// 28
// 對(duì)象hero中不存在age屬性
var result = Object.getOwnPropertyDescriptor(hero, "age");
console.log(result);
原型屬性 自有屬性與原型屬性

自有屬性:通過對(duì)象的引用添加的屬性 其他對(duì)象可能無此屬性 即使有 也是彼此獨(dú)立的屬性
原型屬性:從原型對(duì)象中繼承來的屬性 一旦原型對(duì)象中屬性值改變 所有繼承該原型的對(duì)象屬性均改變

// 定義構(gòu)造函數(shù)
function Hero(name){
    // 構(gòu)造函數(shù)本身的屬性 -> 自有屬性
    this.name = name;
    this.sayMe = function(){
        console.log("this is function");
    }
}
// 通過構(gòu)造函數(shù)Hero的prototype新增屬性或方法
// 通過原型所定義的屬性 -> 原型屬性
Hero.prototype.age = 28;
/*
    通過構(gòu)造函數(shù)Hero創(chuàng)建對(duì)象時(shí)
    * 不僅具有構(gòu)造函數(shù)的自有屬性
    * 還具有構(gòu)造函數(shù)的原型屬性
 */
var hero = new Hero("張三");

console.log(hero.name);// 張三
console.log(hero.age);// 18

var hero2 = new Hero("李四");
console.log(hero2.name);// 李四
console.log(hero2.age);// 28
// 為對(duì)象hero新增age屬性
// hero.age = 80;
// console.log(hero.age);// 80
//
// console.log(hero);
//
// console.log(hero2.age);// 28

Hero.prototype.age = 80;

console.log(hero.age);
console.log(hero2.age);
重寫屬性

通過構(gòu)造函數(shù)或?qū)ο蟮淖杂袑傩钥梢灾貙懺偷膶傩?/p>

// 定義構(gòu)造函數(shù)
function Hero(){
    this.name = "張三";
}
// 構(gòu)造函數(shù)的原型
Hero.prototype.name = "李四";
// 構(gòu)造函數(shù)創(chuàng)建對(duì)象
var hero = new Hero();
// 自有屬性與原型屬性同名時(shí),默認(rèn)訪問的是自有屬性 -> 自有屬性的優(yōu)先級(jí)別高于原型屬性
console.log(hero.name);// 張三

// 刪除對(duì)象的屬性
delete hero.name;
// 重新訪問對(duì)象的屬性
console.log(hero.name);// 李四
檢測(cè)原型屬性
function Hero(){
//this.name = "張三";// 自有屬性
}
 //Hero.prototype.name = "李四";

var hero = new Hero();
/*
    Object.hasOwnProperty(prop)方法
    * 作用 - 判斷當(dāng)前指定屬性是否為自有屬性
    * 參數(shù)
      * prop - 表示指定屬性名稱
    * 返回值 - 布爾值
      * true - 表示存在指定的自有屬性
      * false - 表示不存在指定的自有屬性
 */
// console.log(hero.hasOwnProperty("name"));// true
/*
    使用in關(guān)鍵字檢測(cè)對(duì)象的屬性
    * 作用 - 判斷對(duì)象中是否存在指定屬性(自有屬性或原型屬性)
    * 返回值 - 布爾值
      * true - 表示存在指定的屬性
      * false - 表示不存在指定的屬性
 */
console.log("name" in hero);
操作原型的方式
// 定義構(gòu)造函數(shù)
function Hero(){}
// 通過構(gòu)造函數(shù)的原型新增屬性或方法

// 1.利用對(duì)象.屬性或方法的方式新增屬性或方法
Hero.prototype.name = "張三";
Hero.prototype.sayMe = function(){
    console.log("this is function");
}
// 2.將原型重新賦值為一個(gè)新對(duì)象
Hero.prototype = {
    name : "張三",
    sayMe : function(){
        console.log("this is function");
    }
}

// 通過構(gòu)造函數(shù)創(chuàng)建對(duì)象
var hero = new Hero();

console.log(hero.name);
hero.sayMe();
顯式原型與隱式原型
// 定義構(gòu)造函數(shù)
function Hero(){
    this.name = "張三";
}
// 通過構(gòu)造函數(shù)的原型新增屬性或方法
Hero.prototype.age = 28;
// 通過構(gòu)造函數(shù)創(chuàng)建對(duì)象
var hero = new Hero();

console.log(hero.name);// 對(duì)象調(diào)用自有屬性
console.log(hero.age);// 對(duì)象調(diào)用原型屬性

/*
    所有對(duì)象其實(shí)也具有原型
    * 注意 - 對(duì)象的原型(__proto__)并非是函數(shù)的原型(prototype)
    * 區(qū)分
      * 將函數(shù)的原型 -> 顯式原型
      * 將對(duì)象的原型 -> 隱式原型
    * 對(duì)象的原型
      * 不能用于真實(shí)開發(fā)工作,僅用于邏輯測(cè)試
 */
console.log(hero.prototype);// undefined 表示對(duì)象中不存在該屬性
console.log(hero.__proto__);
isPrototypeOf()方法

每個(gè)對(duì)象中都會(huì)具有一個(gè)isPrototypeOf()方法 該方法用來判斷一個(gè)對(duì)象是否是另一個(gè)對(duì)象的原型

// 通過初始化器方式定義對(duì)象
var obj = {
    name : "張三"
}
//定義構(gòu)造函數(shù)
function Hero(){}
//將對(duì)象obj賦值給構(gòu)造函數(shù)Hero的原型
Hero.prototype = obj;
//通過構(gòu)造函數(shù)創(chuàng)建對(duì)象
var hero = new Hero();
//判斷指定對(duì)象是否是另一個(gè)對(duì)象的原型
var result = obj.isPrototypeOf(hero);

console.log(result);
擴(kuò)展內(nèi)置對(duì)象

JavaScript中的內(nèi)置對(duì)象有些也具有prototype屬性 利用內(nèi)置對(duì)象的prototype屬性可以為內(nèi)置對(duì)象擴(kuò)展屬性或方法
通過原型擴(kuò)展內(nèi)置對(duì)象的屬性和方法非常靈活 根據(jù)個(gè)性化要求制定Java Script語言的具體內(nèi)容

Object.prototype.sayMe = function(){
    console.log("this is sayMe function");
}
// 通過Object構(gòu)造函數(shù)創(chuàng)建對(duì)象
var obj = new Object();

obj.sayMe();


Array.prototype.inArray = function(color){
    // this - 表示當(dāng)前的數(shù)組
    for(var i = 0, len = this.length; i < len; i++){
        if(this[i] === color){
            return true;
        }
    }
    return false;
}
var arr = ["red", "green", "blue"];

console.log(arr.inArray("red")); //true
console.log(arr.inArray("yellow")); //false
繼承 原型鏈?zhǔn)鞘裁?/b>

構(gòu)造函數(shù)或構(gòu)造器具有prototype屬性 對(duì)象具有__proto__屬性 這就是之前學(xué)習(xí)的原型
如果構(gòu)造函數(shù)或?qū)ο驛 A的原型指向構(gòu)造函數(shù)或?qū)ο驜 B的原型在指向構(gòu)造函數(shù)或?qū)ο驝 以此類推 最終的構(gòu)造函數(shù)或?qū)ο蟮脑椭赶騉bject的原型 由此形成一條鏈狀結(jié)構(gòu) 被稱之為原型鏈
按照上述的描述 在B中定義的屬性或方法 可以直接在A中使用并不需要定義 這就是繼承 它允許每個(gè)對(duì)象來訪問其原型鏈上的任何屬性或方法

// 原型鏈
function A(){
    this.a = "a";
}
// 通過構(gòu)造函數(shù)創(chuàng)建對(duì)象
var a = new A();

function B(){
    this.b = "b";
}
// 將B的原型指向?qū)ο骯
B.prototype = a;
// 通過構(gòu)造函數(shù)創(chuàng)建對(duì)象
var b = new B();

console.log(b.b);// b
console.log(b.a);// a

function C(){
    this.c = "c";
}
// 將C的原型指向?qū)ο骲
C.prototype = b;
// 通過構(gòu)造函數(shù)創(chuàng)建對(duì)象
var c = new C();

console.log(c.c);// c
console.log(c.b);// b
console.log(c.a);// a
只繼承于原型

處于對(duì)效率的考慮 盡可能地將屬性和方法添加到原型上
1.不要為繼承關(guān)系多帶帶創(chuàng)建新對(duì)象
2.盡量減少運(yùn)行時(shí)的方法搜索

// 原型鏈
function A(){
    // 將自有屬性改寫為原型屬性
    // this.a = "a";
}
A.prototype.a = "a";

function B(){
    // this.b = "b";
}

// 將B的原型指向
B.prototype = A.prototype;

B.prototype.b = "b";
/*B.prototype = {
    b : "b"
}*/

function C(){
    this.c = "c";
}
// 將C的原型指向
C.prototype = B.prototype;

var c = new C();
console.log(c.c);// c
console.log(c.b);
console.log(c.a);// a
原型鏈實(shí)現(xiàn)繼承的問題
// 原型鏈
function A(){
    // 將自有屬性改寫為原型屬性
    // this.a = "a";
}
A.prototype.a = "a";

function B(){
    // this.b = "b";
}

// 將B的原型指向
B.prototype = A.prototype;

B.prototype.b = "b";

function C(){
    // this.c = "c";
}
// 將C的原型指向
C.prototype = B.prototype;
C.prototype.c = "c";

var c = new C();
console.log(c.c);// c
console.log(c.b);// b
console.log(c.a);// a

var a = new A();

console.log(a.a);
console.log(a.b);
console.log(a.c);

var b = new B();

console.log(b.a);
console.log(b.b);
console.log(b.c);

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/108285.html

相關(guān)文章

  • JavaScript系列--淺析原型繼承

    摘要:綜上所述有原型鏈繼承,構(gòu)造函數(shù)繼承經(jīng)典繼承,組合繼承,寄生繼承,寄生組合繼承五種方法,寄生組合式繼承,集寄生式繼承和組合繼承的優(yōu)點(diǎn)于一身是實(shí)現(xiàn)基于類型繼承的最有效方法。 一、前言 繼承是面向?qū)ο螅∣OP)語言中的一個(gè)最為人津津樂道的概念。許多面對(duì)對(duì)象(OOP)語言都支持兩種繼承方式::接口繼承 和 實(shí)現(xiàn)繼承 。 接口繼承只繼承方法簽名,而實(shí)現(xiàn)繼承則繼承實(shí)際的方法。由于js中方法沒有簽名...

    draveness 評(píng)論0 收藏0
  • 徹底理解Javascript中的原型繼承

    摘要:在節(jié)中,我們學(xué)習(xí)到了通過構(gòu)造函數(shù)創(chuàng)建對(duì)象的三個(gè)重要步驟,其中的一步是把構(gòu)造函數(shù)的對(duì)象設(shè)置為創(chuàng)建對(duì)象的原型。利用而不是直接用創(chuàng)建一個(gè)實(shí)例對(duì)象的目的是,減少一次調(diào)用父構(gòu)造函數(shù)的執(zhí)行。 JavaScript語言不像面向?qū)ο蟮木幊陶Z言中有類的概念,所以也就沒有類之間直接的繼承,JavaScript中只有對(duì)象,使用函數(shù)模擬類,基于對(duì)象之間的原型鏈來實(shí)現(xiàn)繼承關(guān)系,ES6的語法中新增了class關(guān)鍵...

    ziwenxie 評(píng)論0 收藏0
  • 你是否理解js的ObjectFunction原型

    摘要:原型對(duì)象是由創(chuàng)建的,因此原型對(duì)象的構(gòu)造函數(shù)是構(gòu)造函數(shù)也可以是稱為對(duì)象,原型對(duì)象也就繼承了其生父構(gòu)造函數(shù)中的數(shù)據(jù),也同時(shí)繼承了原型對(duì)象的數(shù)據(jù)。當(dāng)然這條原型鏈中的數(shù)據(jù),會(huì)被還是還是這類構(gòu)造函數(shù)繼承,但是不會(huì)被這些繼承,他們不處于同一個(gè)鏈條上。 js中,F(xiàn)unction的本質(zhì)是什么?Object的本質(zhì)又是什么?js中有幾條原型鏈? showImg(https://segmentfault.c...

    itvincent 評(píng)論0 收藏0
  • javaScript原型原型詳解(二)

    摘要:當(dāng)然這還沒完,因?yàn)槲覀冞€有重要的一步?jīng)]完成,沒錯(cuò)就是上面的第行代碼,如果沒有這行代碼實(shí)例中的指針是指向構(gòu)造函數(shù)的,這樣顯然是不對(duì)的,因?yàn)檎G闆r下應(yīng)該指向它的構(gòu)造函數(shù),因此我們需要手動(dòng)更改使重新指向?qū)ο蟆? 第一節(jié)內(nèi)容:javaScript原型及原型鏈詳解(二) 第一節(jié)中我們介紹了javascript中的原型和原型鏈,這一節(jié)我們來講利用原型和原型鏈我們可以做些什么。 普通對(duì)象的繼承 ...

    widuu 評(píng)論0 收藏0
  • 進(jìn)擊JavaScript之(四)原型原型

    摘要:每一個(gè)由構(gòu)造函數(shù)創(chuàng)建的對(duì)象都會(huì)默認(rèn)的連接到該神秘對(duì)象上。在構(gòu)造方法中也具有類似的功能,因此也稱其為類實(shí)例與對(duì)象實(shí)例一般是指某一個(gè)構(gòu)造函數(shù)創(chuàng)建出來的對(duì)象,我們稱為構(gòu)造函數(shù)的實(shí)例實(shí)例就是對(duì)象。表示該原型是與什么構(gòu)造函數(shù)聯(lián)系起來的。 本文您將看到以下內(nèi)容: 傳統(tǒng)構(gòu)造函數(shù)的問題 一些相關(guān)概念 認(rèn)識(shí)原型 構(gòu)造、原型、實(shí)例三角結(jié)構(gòu)圖 對(duì)象的原型鏈 函數(shù)的構(gòu)造函數(shù)Function 一句話說明什么...

    XBaron 評(píng)論0 收藏0
  • 原型原型理解

    原型與原型鏈理解 1. 什么是原型 JavaScript是一種簡易的腳本語言,其是由對(duì)象構(gòu)成。每一個(gè)JavaScript對(duì)象(除null外)都和另一個(gè)對(duì)象相關(guān)聯(lián),另一個(gè)對(duì)象就是原型。也就是說,任何一個(gè)對(duì)象都有原型這個(gè)屬性。 隱式原型(_proto_):上面說的這個(gè)原型是JavaScript中的內(nèi)置屬性[[prototype]],此屬性繼承自object對(duì)象,在腳本中沒有標(biāo)準(zhǔn)的方式訪問[[pro...

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

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

0條評(píng)論

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