js 原型和原型鏈

來源:互聯網
上載者:User

標籤:小數   數位   無效   nbsp   hive   efi   就會   怎麼辦   this   

原型使用方式

1.通過給Calculator對象的prototype屬性賦值對象字面量來設定Calculator對象的原型

 var Calculator = function (decimalDigits, tax) {            this.decimalDigits = decimalDigits;            this.tax = tax;        };Calculator.prototype = {            add: function (x, y) {                return x + y;            },            subtract: function (x, y) {                return x - y;            }        };(new Calculator()).add(1, 3);//4

2.在賦值原型prototype的時候使用function立即執行的運算式來賦值

Calculator.prototype = function () {            add = function (x, y) {                return x + y;            },            subtract = function (x, y) {                return x - y;            }            return {                add: add,                subtract: subtract            }        } ();(new Calculator()).add(11, 3);//4
分步聲明:

上述使用原型的時候,有一個限制就是一次性設定了原型對象,如何分開設定原型的每個屬性呢?

var BaseCalculator = function () {    //為每個執行個體都聲明一個小數位元    this.decimalDigits = 2;};        //使用原型給BaseCalculator擴充2個對象方法BaseCalculator.prototype.add = function (x, y) {    return x + y;};BaseCalculator.prototype.subtract = function (x, y) {    return x - y;};

建立完上述代碼以後,我們來開始:

var Calculator = function () {    //為每個執行個體都聲明一個稅收數字    this.tax = 5;};        Calculator.prototype = new BaseCalculator();

我們可以看到Calculator的原型是指向到BaseCalculator的一個執行個體上,目的是讓Calculator整合它的add(x,y)和subtract(x,y)這2個function,還有一點要說的是,由於它的原型是BaseCalculator的一個執行個體,所以不管你建立多少個Calculator對象執行個體,他們的原型指向的都是同一個執行個體。

var calc = new Calculator();acalc.add(1, 1);//2//BaseCalculator 裡聲明的decimalDigits屬性,在 Calculator裡是可以訪問到的calc.decimalDigits; //2

上面的代碼,運行以後,我們可以看到因為Calculator的原型是指向BaseCalculator的執行個體上的,所以可以訪問他的decimalDigits屬性值,那如果我不想讓Calculator訪問BaseCalculator的建構函式裡聲明的屬性值,那怎麼辦呢?

Calculator.prototype = BaseCalculator.prototype;

通過將BaseCalculator的原型賦給Calculator的原型,這樣你在Calculator的執行個體上就訪問不到那個decimalDigits值了

屬性尋找:

當尋找一個對象的屬性時,JavaScript 會向上遍曆原型鏈,直到找到給定名稱的屬性為止,到尋找到達原型鏈的頂部 - 也就是 Object.prototype - 但是仍然沒有找到指定的屬性,就會返回 undefined

 function foo() {            this.add = function (x, y) {                return x + y;            }        }        foo.prototype.add = function (x, y) {            return x + y + 10;        }        Object.prototype.subtract = function (x, y) {            return x - y;        }        var f = new foo();        f.add(1, 2); //結果是3,而不是13        f.subtract(1, 2); //結果是-1

通過代碼運行,我們發現subtract是安裝我們所說的向上尋找來得到結果的,但是add方式有點小不同,這也是我想強調的,就是屬性在尋找的時候是先尋找自身的屬性,如果沒有再尋找原型,再沒有,再往上走,一直插到Object的原型上,所以在某種層面上說,用 for in語句遍曆屬性的時候,效率也是個問題。

還有一點我們需要注意的是,我們可以賦值任何類型的對象到原型上,但是不能賦值原子類型的值,比如如下代碼是無效的:

function Foo() {}Foo.prototype = 1; // 無效
hasOwnProperty函數:

hasOwnProperty是Object.prototype的一個方法,它可是個好東西,他能判斷一個對象是否包含自訂屬性而不是原型鏈上的屬性,因為hasOwnProperty 是 JavaScript 中唯一一個處理屬性但是不尋找原型鏈的函數。

// 修改Object.prototypeObject.prototype.bar = 1; var foo = {goo: undefined};foo.bar; // 1‘bar‘ in foo; // truefoo.hasOwnProperty(‘bar‘); // falsefoo.hasOwnProperty(‘goo‘); // true

只有 hasOwnProperty 可以給出正確和期望的結果,這在遍曆對象的屬性時會很有用。 沒有其它方法可以用來排除原型鏈上的屬性,而不是定義在對象自身上的屬性。

但有個噁心的地方是:JavaScript 不會保護 hasOwnProperty 被非法佔用,因此如果一個對象碰巧存在這個屬性,就需要使用外部的 hasOwnProperty 函數來擷取正確的結果。

var foo = {    hasOwnProperty: function() {        return false;    },    bar: ‘Here be dragons‘};foo.hasOwnProperty(‘bar‘); // 總是返回 false// 使用{}對象的 hasOwnProperty,並將其上下為設定為foo{}.hasOwnProperty.call(foo, ‘bar‘); // true

參考:http://www.cnblogs.com/TomXu/archive/2012/01/05/2305453.html

 

js 原型和原型鏈

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.