真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JavaScript原型鏈指的是什么

這篇文章主要為大家展示了“JavaScript原型鏈指的是什么”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“JavaScript原型鏈指的是什么”這篇文章吧。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設、鳳縣網(wǎng)站維護、網(wǎng)站推廣。

1.原型鏈

1.1 原型鏈解釋:

  1. (概念)原型鏈指一些原型通過__proto__指針構成的鏈表,一個原型鏈可以為想共享原型鏈中數(shù)據(jù)的對象服務,用于實現(xiàn)JavaScript中的繼承機制。

  2. (原型鏈指針)原型鏈中涉及到的指針:

    • 每個對象都有一個__proto__指針來訪問對象的原型

    • 每個原型都是一個用于實現(xiàn)繼承的對象,除了有__proto__指針之外,還有constructor指針指向構造函數(shù)

    • 每個函數(shù)都是一個對象,除了有__proto__指針之外,還有prototype指針指向與之關聯(lián)的原型對象,prototype的指向和__proto__指向不一定相同。

1.2 不涉及繼承的原型鏈圖示:

  1. 構造函數(shù)類型原型鏈:原型鏈服務的對象由構造函數(shù)產生 (這張圖非常重要,涉及了底層的鏈,網(wǎng)上也有類似的圖)

function A() {

}
let a1 = new A()
let a2 = new A()
let a3 = new A()
// 這幾行代碼會產生下面圖示的原型鏈

JavaScript原型鏈指的是什么

  1. 非構造函數(shù)類型原型鏈:原型鏈服務的對象由工廠函數(shù),對象字面量,Object.create等方式產生

let A = {
    test: ""
}
let a1 = Object.create(A)
let a2 = Object.create(A)
let a3 = Object.create(A)
// 這幾行代碼對應下面圖示的原型鏈

JavaScript原型鏈指的是什么

  1. 簡化的原型鏈:實際考慮原型鏈時往往不需要考慮“構造函數(shù)Function的實例對應的原型鏈”,甚至"原型鏈終點"和"Object.prototype"都不需要考慮。因為涉及到復雜的繼承關系時考慮這些偏底層的內容不利于分析。一般分析時使用下面的兩個簡化圖分析即可。

function A() {

}
let a1 = new A()
let a2 = new A()
let a3 = new A()
// 這幾行代碼會產生下面圖示的原型鏈

JavaScript原型鏈指的是什么

1.3 涉及繼承的原型鏈圖示

涉及繼承的原型鏈使用簡化圖分析即可

// 使用寄生組合模式實現(xiàn)繼承
function C() {}
function B() {}
B.prototype = new C()
function A() {}
A.prototype = new B()

let a1 = new A()
let a2 = new A()
let a3 = new A()

JavaScript原型鏈指的是什么

1.4 原型鏈終點

原型鏈的終點是null,并不是指某個原型對象

1.5 原型的動態(tài)性

原型的動態(tài)性在“面向對象編程”中詳細解釋過,主要涉及的是原型的重寫和修改。這里列舉幾個例題。
例題1—原型的動態(tài)性

var A = function() {};
A.prototype.n = 1;
var b = new A();
A.prototype = {
    n: 2,
    m: 3
}
var c = new A();

console.log(b.n); // 1
console.log(b.m); // undefined

console.log(c.n); // 2
console.log(c.m); // 3

例題2—原型的動態(tài)性&原型鏈底層鏈

var F = function() {};

Object.prototype.a = function() {
    console.log('a');
};

Function.prototype.b = function() {
    console.log('b');
}

var f = new F();

f.a(); // a
f.b(); // 并不存在b屬性

F.a(); // a
F.b(); // b

參考上述提到的“不涉及繼承的原型鏈圖示”中的第一幅圖可以畫出如下簡化參考圖分析問題。
JavaScript原型鏈指的是什么

例題3—原型動態(tài)性&原型鏈底層鏈

function Person(name) {
    this.name = name
}
let p = new Person('Tom');
console.log(p.__proto__) //  Person.prototype
console.log(Person.__proto__) // Function.prototype

例題4—原型動態(tài)性&原型鏈底層鏈

var foo = {}, F = function(){};
Object.prototype.a = 'value a';
Function.prototype.b = 'value b';
Object.prototype = {
    a: "value a"
}
Function.prototype = {
    b: "value b"
}

console.log(foo.a); // value a
console.log(foo.b); // undefined

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

參考上述提到的“不涉及繼承的原型鏈圖示”中的第一幅圖可以畫出如下簡化參考圖分析問題。由于foo和F聲明時它們就將自己的原型進行綁定,它們通過棧內存中存儲的指針獲取堆內存中存儲的原型的地址。首先進行了原型的修改操作,修改操作會在堆內存上修改原型,foo和F通過棧內存的指針仍然可以訪問到修改后的結果。第二步進行了原型的重寫,JS都是“傳值操作”,重寫原型后,首先在堆內存中開辟一塊新空間存儲新的原型,然后在棧內存重新開辟一個空間存儲指向堆內存的指針。此時由于foo和F持有的棧內存指針和新的棧內存指針不同,所以foo和F無法訪問到重寫后的原型。
JavaScript原型鏈指的是什么

以上是“JavaScript原型鏈指的是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


分享題目:JavaScript原型鏈指的是什么
文章轉載:http://weahome.cn/article/jshpii.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部