最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS原型和原型鏈原理與用法實例詳解

 更新時間:2020年02月05日 10:40:40   作者:米彩  
這篇文章主要介紹了JS原型和原型鏈原理與用法,結合實例形式詳細分析了js原型和原型鏈概念、原理、使用方法及相關操作注意事項,需要的朋友可以參考下

本文實例講述了JS原型和原型鏈原理與用法。分享給大家供大家參考,具體如下:

Javascript語言的繼承機制一直很難被人理解。

它沒有"子類"和"父類"的概念,也沒有"類"(class)和"實例"(instance)的區(qū)分,全靠一種很奇特的"原型鏈"(prototype chain)模式,來實現(xiàn)繼承。

Brendan Eich設計javascript之初是為了實現(xiàn)網(wǎng)頁與瀏覽器之間交互的一種簡單的腳本語言

如果真的是一種簡易的腳本語言,其實不需要有"繼承"機制。但是,Javascript里面都是對象,必須有一種機制,將所有對象聯(lián)系起來。所以,Brendan Eich最后還是設計了"繼承"。

背景介紹

1.構造函數(shù)

構造函數(shù) ,是一種特殊的方法。主要用來在創(chuàng)建對象時初始化對象。每個構造函數(shù)都有prototype(原型)屬性

2.原型模式

每個函數(shù)都有prototype(原型)屬性,這個屬性是一個指針,指向一個對象,這個對象的用途是包含特定類型的所有實例共享的屬性和方法,即這個原型對象是用來給實例共享屬性和方法的。

而每個實例內(nèi)部都有一個指向原型對象的指針。

原型鏈

每個構造函數(shù)都有一個原型對象,原型對象都包含一個指向構造函數(shù)的指針,而實例都包含指向原型對象內(nèi)部的指針。我們讓原型對象的實例(1)等于另一個原型對象(2),

此時原型對象(2)將包含一個指向原型對象(1)的指針,

再讓原型對象(2)的實例等于原型對象(3),如此層層遞進就構成了實例和原型的鏈條,這就是原型鏈的概念

構造函數(shù)

構造函數(shù) ,是一種特殊的方法。主要用來在創(chuàng)建對象時初始化對象。 即為對象變量賦初始值。每個構造函數(shù)的實例都將共享構造函數(shù)的初始值。 構造函數(shù)的出現(xiàn)是為了解決使用Object構造函數(shù)和字面量表示法不方便創(chuàng)建大量重復對象的問題。

傳統(tǒng)創(chuàng)建對象實例的方法

  var person={
    name:'張女士',
    age:'80',
    gender:'女'
  };
 console.log(person)

注:這個方法如果用于創(chuàng)建大量相同屬性和方法的對象時,會產(chǎn)生大量重復代碼

構造函數(shù)的方法

//構造函數(shù)方法創(chuàng)建對象實例
function Person(name,age,gender) {
this.name=name;
this.age=age;
this.gender=gender;
this.say=function () {
    alert(this.name)
  }
}
var person1=new Person('鐘女士',80,'女');
var person2=new Person('張女士',80,'女');
console.log(person2)
console.log(person1)

原型模式

使用構造函數(shù)的問題是,每個方法都要在每個實例上重新創(chuàng)建一遍,即在構造函數(shù)的不同實例上的同名函數(shù)是不相等的。而我們創(chuàng)建每個構造函數(shù)都有一個prototype(原型)屬性,這個屬性是個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法,我們使用這個原型對象來共享實例的屬性和方法的模式就叫原型模式

//原型模式創(chuàng)建對象
function Person(){
}
Person.prototype.name='鐘女士';
Person.prototype.age=80;
Person.prototype.gender='女';
var person1= new Person();
console.log(person1)
//簡寫原型模式
Person.prototype={
  constructor:Person
  name:'鐘女士',
  age:80,
  gender:'女'
}

注:每個原型對象都有constructor屬性,由于簡寫模式重寫了默認的prototype對象,所以constructor也會被重新定義,不再指向他的構造函數(shù),所以可以自己寫一個constructor屬性指向他的構造函數(shù)

原型鏈

每個構造函數(shù)都有原型對象,每個構造函數(shù)實例都包含一個指向原型對象的內(nèi)部指針(proto),如果我們讓第一個構造函數(shù)的原型對象等于第二個構造函數(shù)的實例,結果第一個構造函數(shù)的原型對象將包含一個指向第二個原型對象的指針,再然第三個原型對象等于第一個構造函數(shù)的實例,這樣第三個原型對象也將包含指向第一個原型對象的指針,以此類推,就夠成了實例于原型的鏈條,這就是原型鏈的基本概念

function One(){
}
function Two(){
}
function Three(){
}
Two.prototype=new One();
Three.prototype=new Two();
var three=new Three();
console.log(three);
console.log(three.__proto__===Three.prototype) //true
console.log(three.__proto__.__proto__===Two.prototype) //true
console.log(three.__proto__.__proto__.__proto__===One.prototype) //true
console.log(three.__proto__.__proto__.__proto__.__proto__===Object.prototype) //true

在對象實例中,訪問對象原型的方法

  • 1、使用proto屬性

此屬性是瀏覽器支持的一個屬性,并不是ECMAScript里的屬性

  • 2.Object.getPrototypeOf
  • 3.使用constructor.prototype的方法

對于不支持proto的瀏覽器,可以使用constructor,訪問到對象的構造函數(shù),在用prototype訪問到原型

使用原型鏈解釋ANUGLAR作用域

在開發(fā)過程中,我們可能會出現(xiàn)控制器的嵌套,看下面這段代碼:

  <div ng-controller="OuterCtrl">
    <span>{{a}}</span>
     <div ng-controller="InnerCtrl">
      <span>{{a}}</span>
     </div>
   </div>
  <script>
  function OuterCtrl($scope) {
  $scope.a = 1;
  }
  function InnerCtrl($scope) {
  }
  </script>

我們可以看到界面顯示了兩個1,而我們只在OuterCtrl的作用域里定義了a變量,但界面給我們的結果是,兩個a都有值,現(xiàn)在自控制器里的a是從父控制器里繼承過來的

我們可以父子級的作用域看成兩個原型對象,其中一個原型對象繼承另一個原型對象的實例

function Outer() {
  this.a = 1;
}
function Inner() {
}
var outer = new Outer();
Inner.prototype=new Outer();
var inner = new Inner();
console.log(outer.a)
console.log(inner.a)

Angular的實現(xiàn)機制其實也就是把這兩個控制器中的$scope作了關聯(lián),外層的作用域?qū)嵗蔀榱藘?nèi)層作用域的原型。

既然作用域是通過原型來繼承的,自然也就可以推論出一些特征來。比如說這段代碼,點擊按鈕的結果是什么?

<div ng-controller="OuterCtrl">
  <span>{{a}}</span>
  <div ng-controller="InnerCtrl">
    <span>{{a}}</span>
    <button ng-click="a=a+1">a++</button>
  </div>
</div>
<script>
function OuterCtrl($scope) {
  $scope.a = 1;
}
 
function InnerCtrl($scope) {
}
</script>

點了按鈕之后,兩個a不一致了,里面的變了,外面的沒變,這是為什么?

function Outer() {
  this.a = 1;
}
function Inner() {
}
var outer = new Outer();
Inner.prototype=new Outer();
var inner = new Inner();
inner.a = inner.a + 1;
console.log(outer.a)
console.log(inner.a)

因為在原型鏈中,訪問一個實例屬性時,會在實例本身查找,如果找不到,則搜索實例的原型,如果再搜索不到,則繼續(xù)沿著原型鏈往上查找。找到之后則會賦給該實例,所以inner上面就被賦值了一個新的a,outer里面的仍然保持原樣,這也就導致了剛才看到的結果。

上下級共享變量

比如說,我們就是想上下級共享變量,不創(chuàng)建新的,該怎么辦呢?

function Outer() {
  this.data = {
    a: 1
  };
}
function Inner() {
}
var outer = new Outer();
Inner.prototype = outer;
var inner = new Inner();
console.log(outer.data.a);
console.log(inner.data.a);
inner.data.a += 1;
console.log(outer.data.a);
console.log(inner.data.a);

我們可以把a寫在一個對象里,當inner找到對象data并賦值到自己身上時,其實是復制了對象的指針(參考高程第4章復制引用類型和基本類型的區(qū)別),我們對對象里的屬性的改動都會反映到所有引用該對象的元素上。
反映到AngularJs,我們可以這么寫

<div ng-controller="OuterCtrl">
  <span>{{data.a}}</span>
  <div ng-controller="InnerCtrl">
    <span>{{data.a}}</span>
    <button ng-click="data.a=data.a+1">increase a</button>
  </div>
</div>
<script>
function OuterCtrl($scope) {
  $scope.data = {
    a: 1
  };
}
function InnerCtrl($scope) {
}
</script>

這樣點擊按鈕兩個控制器的a都會+1

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內(nèi)容可查看本站專題:《JavaScript常用函數(shù)技巧匯總》、《javascript面向?qū)ο笕腴T教程》、《JavaScript查找算法技巧總結》、《JavaScript錯誤與調(diào)試技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》及《JavaScript數(shù)學運算用法總結

希望本文所述對大家JavaScript程序設計有所幫助。

相關文章

  • 8個有意思的JavaScript面試題

    8個有意思的JavaScript面試題

    JavaScript 是一種有趣的語言,我們都喜歡它,因為它的性質(zhì)。這篇文章主要介紹了8個有意思的JavaScript面試題 ,需要的朋友可以參考下
    2019-07-07
  • JavaScript 快捷鍵設置實現(xiàn)代碼

    JavaScript 快捷鍵設置實現(xiàn)代碼

    屏蔽Alt+F4等快捷鍵 IE Javascript快捷鍵操作
    2009-03-03
  • js中利用tagname和id獲取元素的方法

    js中利用tagname和id獲取元素的方法

    這篇文章主要介紹了js中利用tagname和id獲取元素的方法,主要包括三種方法,需要的朋友可以參考下
    2016-01-01
  • echart中tooltip自動展示代碼示例

    echart中tooltip自動展示代碼示例

    這篇文章主要給大家介紹了關于echart中tooltip自動展示的相關資料,ECharts是一款基于JavaScript的數(shù)據(jù)可視化圖表庫,提供直觀,生動,可交互,可個性化定制的數(shù)據(jù)可視化圖表,需要的朋友可以參考下
    2023-09-09
  • JS實現(xiàn)Date日期格式的本地化的方法小結

    JS實現(xiàn)Date日期格式的本地化的方法小結

    為了更好的更新多語言日期的顯示,所以希望實現(xiàn)日期的本地化格式顯示要求,常規(guī)的特殊字符型格式化無法滿足顯示要求,這里整理了幾種我思考實現(xiàn)的本地化實現(xiàn)功能
    2024-06-06
  • js 彈出菜單/窗口效果

    js 彈出菜單/窗口效果

    想象一下,你把一個重要內(nèi)容放在一個彈出窗口,又不聚集到這個窗口。讓使用屏幕閱讀器的同學情何以堪,只有當他們 tab 到這頁面結束,還繼續(xù) tab,才可能找到這個彈窗
    2011-10-10
  • IE8中動態(tài)創(chuàng)建script標簽onload無效的解決方法

    IE8中動態(tài)創(chuàng)建script標簽onload無效的解決方法

    這篇文章主要介紹了IE8中動態(tài)創(chuàng)建script標簽onload無效的解決方法,涉及針對javascript加載順序的調(diào)整,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • javascript中返回頂部按鈕的實現(xiàn)

    javascript中返回頂部按鈕的實現(xiàn)

    這篇文章主要介紹了使用javascript實現(xiàn)博客園頁面右下角返回頂部按鈕的思路及源碼,非常不錯,這里推薦給小伙伴們
    2015-05-05
  • JavaScript獲取瀏覽器窗口尺寸的幾種方法

    JavaScript獲取瀏覽器窗口尺寸的幾種方法

    JavaScript是一種廣泛使用的腳本語言,用于開發(fā)網(wǎng)頁和應用程序,在Web開發(fā)中,經(jīng)常需要獲取瀏覽器窗口的尺寸,以便根據(jù)窗口大小進行布局或執(zhí)行其他操作,本文將介紹如何使用JavaScript來獲取瀏覽器窗口尺寸,需要的朋友可以參考下
    2023-11-11
  • javascript實現(xiàn)頁面內(nèi)關鍵詞高亮顯示代碼

    javascript實現(xiàn)頁面內(nèi)關鍵詞高亮顯示代碼

    關鍵詞高亮想必大家對它都不陌生吧,應用也比較廣泛的,下面為大家介紹下通過javascript是如何實現(xiàn)頁面內(nèi)關鍵詞高亮顯示
    2014-04-04

最新評論

武汉市| 鹿泉市| 扎鲁特旗| 招远市| 开江县| 诸暨市| 湖北省| 万载县| 封开县| 济阳县| 昌乐县| 聊城市| 获嘉县| 新宁县| 尉氏县| 兴安盟| 新晃| 泸西县| 理塘县| 高陵县| 弥渡县| 广河县| 广昌县| 闻喜县| 荃湾区| 祥云县| 阿城市| 三都| 临高县| 沅江市| 济阳县| 门头沟区| 阳山县| 南涧| 上思县| 延寿县| 驻马店市| 闽侯县| 尼玛县| 大石桥市| 冷水江市|