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

資訊專欄INFORMATION COLUMN

徹底搞清JS中的this,construtor,prototype

NoraXie / 1313人閱讀

摘要:再看和是一個(gè)對(duì)象的屬性,這個(gè)屬性存在在此對(duì)象的中指向此對(duì)象的構(gòu)造函數(shù)。在中指向構(gòu)造函數(shù)例子此種方式定義的是隱藏的默認(rèn)指向例子為什么是這種定義是把重寫了覆蓋了默認(rèn)的。

this定義

this是對(duì)象

this依賴函數(shù)執(zhí)行的上下文

this存在于函數(shù)中(函數(shù)調(diào)用的時(shí)候被隱式傳入)

直接看例子:

    alert(this); //在全局環(huán)境調(diào)用this, this指向window,  輸出[Object window]
   
     function Person(){
         alert(this);
    } 

     方式一:  
      Person(); // 全局環(huán)境用Person函數(shù), this指向window,  輸出[Object window]

     方式二: 
     var obj = new Person(); //把Person當(dāng)做構(gòu)造函數(shù), 實(shí)例化一個(gè)對(duì)象
                             //此時(shí)this指向了obj, 不再指向window,  輸出[Object object]
     
     function Person(){
        alert(this.name); //此時(shí)無(wú)法判斷this的身份
     }
     
     Person(); //this在全局環(huán)境中被調(diào)用, this.name == window.name, 輸出了窗口的名字
     var obj = new Person(); //this在obj環(huán)境下被調(diào)用, this.name == obj.name, 由于name沒(méi)被賦值, 所以輸出undefined
     
     
     由此可以看出, 我們?cè)陂喿x代碼或者寫代碼時(shí),看到某個(gè)函數(shù)中定義的this時(shí), 還無(wú)法去判斷那個(gè)this身份,必須找到它依賴執(zhí)行的環(huán)境(對(duì)象)。
     再回頭看看this的定義,大家就清楚自然了。
再看constructor和prototype

constructor是一個(gè)對(duì)象的屬性,這個(gè)屬性存在在此對(duì)象的prototype中, 指向此對(duì)象的構(gòu)造函數(shù)。分析這句話

constructor是一個(gè)對(duì)象屬性。

constructor在prototype中

constructor指向構(gòu)造函數(shù)

例子1:

    function Person(name, age){
        this.name = name;
        this.age = age;
    }
    Person.prototype.getName = function(){
        alert(this.name);
    }
    Person.prototype.getAge = function(){
        alert(this.age);
    }
    var obj = new Person();
    alert(obj.constructor == Person);// true
    此種方式定義的prototype, constructor是隱藏的, 默認(rèn)指向Person
    
例子2:
    function Person(name, age){
        this.name = name;
        this.age = age;
    }
    Person.prototype = {
        getName: function(){
           alert(this.name);
        },
        getAge: function(){
           alert(this.age);
        }
    }
    var obj = new Person();
    alert(obj.constructor == Person);// false
    
    為什么是false? 這種定義prototype, 是把prototype重寫了, 覆蓋了默認(rèn)的constructor。
    換句話說(shuō), 其實(shí)這種方式就是給屬性重新賦值了, 所以導(dǎo)致默認(rèn)的constructor被覆蓋。
    此時(shí)的obj.constructor將指向的是Object。
    
    改寫一下上面的:
    Person.prototype = {
        constructor: Person, //強(qiáng)制指向Person
        getName: function(){
           alert(this.name);
        },
        getAge: function(){
           alert(this.age);
        }
    }
    此時(shí)constructor就指向Person了。
    
    prototype是一個(gè)函數(shù)屬性, 此屬性同時(shí)也是一個(gè)對(duì)象, 保存著對(duì)象實(shí)例所共有的屬性和方法。
    
    分析這句話:
        1.prototype是函數(shù)屬性, 只要是函數(shù), 就有prototype屬性. 而不管是構(gòu)造函數(shù)還是普通函數(shù).
        2.prototype同時(shí)也是對(duì)象.
        2.prototype放的是公共的東西, 包括屬性和方法.
        
    例子1.
        function Person(name, age){
            this.name = name;
            this.age = age;
        }
        
        //是函數(shù)就有prototype屬性, 這個(gè)屬性也是一個(gè)對(duì)象
        Person.prototype = {
            getName: function(){ //所有對(duì)象實(shí)例都共享
                return this.name;
            },
            getAge: function(){//所有對(duì)象實(shí)例都共享
                return this.age;
            }
        }
    
        var obj = new Person("tom", 23);
        obj.getName(); //"tom"
        var obj2 = new Person("jack", 23);
        obj2.getName(); //"jack"
        obj.getName == obj2.getName; //true, 所有實(shí)例共享
        Person.prototype.getName(); //當(dāng)做普通函數(shù)屬性, 根據(jù)this定義, 此時(shí)this指向的是Person.prototype, 所以返回undefined
  
  以上就是this, constructor, prototype的定義和他們之間的關(guān)系. 可能還有些粗糙, 歡迎大家補(bǔ)充.
  
  綜合例子:
    
    var Tinker = function(){
        this.elements = [];
    
    };
        Tinker.fn = Tinker.prototype = {
            constructor: Tinker,
            extend: function(obj){
                var p;
                for(p in obj){
                    this.constructor.prototype[p] = obj[p];//此處若看明白了, 那么前面的就理解了
                }
            }
        
        }
        Tinker.fn.extend({
           get: function(){
                var length = arguments.length,
                i = 0;
               for(; i < length; i++){
                   this.elements.push(document.getElementById(arguments[i])); //此處若看明白了, 那么前面的就理解了
               }
               return this;//此處若看明白了, 那么前面的就理解了
           },
           each: function(fn){
                var i = 0,
                    length = this.elements.length;
                for(; i < length; i++){
                    fn.call(this.elements[i], i, this.elements[i]);
                }
                return this;//此處若看明白了, 那么前面的就理解了
           }
            
        });
    
   這個(gè)例子其實(shí)很簡(jiǎn)單, 就是向一個(gè)對(duì)象原型添加方法.一個(gè)方法是get, 用于查找頁(yè)面id. 一個(gè)是each, 用于對(duì)找到的id元素執(zhí)行一個(gè)方法

   //假設(shè)有id = "data", id = "message"
   var obj = new Tinker();
   obj.get("data", "message").each(function(i, item){
    this.style.cssText = "height:20px; background:#ff0000";
  })

轉(zhuǎn)自http://www.cnblogs.com/tinkbe...

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

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

相關(guān)文章

  • JS高級(jí)程序設(shè)計(jì)》讀書筆記----JS創(chuàng)建對(duì)象的七種模式

    摘要:用對(duì)象字面量形式創(chuàng)建的對(duì)象,直接賦值給函數(shù)的原型對(duì)象,本質(zhì)上完全重寫了其對(duì)象,因此屬性也就變成了新對(duì)象的屬性指向構(gòu)造函數(shù),不再指向函數(shù)。 【上一篇】:JavaScript對(duì)象內(nèi)部屬性及其特性總結(jié) showImg(https://segmentfault.com/img/bVbjYsc?w=839&h=489); 工廠模式(★★) 先在內(nèi)部顯示地創(chuàng)建一個(gè)臨時(shí)對(duì)象,根據(jù)接收的參數(shù)來(lái)構(gòu)建(賦...

    Dogee 評(píng)論0 收藏0
  • 徹底搞懂JavaScript中的繼承

    摘要:這正是我們想要的太棒了毫不意外的,這種繼承的方式被稱為構(gòu)造函數(shù)繼承,在中是一種關(guān)鍵的實(shí)現(xiàn)的繼承方法,相信你已經(jīng)很好的掌握了。 你應(yīng)該知道,JavaScript是一門基于原型鏈的語(yǔ)言,而我們今天的主題 -- 繼承就和原型鏈這一概念息息相關(guān)。甚至可以說(shuō),所謂的原型鏈就是一條繼承鏈。有些困惑了嗎?接著看下去吧。 一、構(gòu)造函數(shù),原型屬性與實(shí)例對(duì)象 要搞清楚如何在JavaScript中實(shí)現(xiàn)繼承,...

    _ivan 評(píng)論0 收藏0
  • js的方法實(shí)現(xiàn)一個(gè)new

    摘要:運(yùn)算符創(chuàng)建一個(gè)用戶定義的對(duì)象類型的實(shí)例或具有構(gòu)造函數(shù)的內(nèi)置對(duì)象的實(shí)例。新建對(duì)象鏈接對(duì)象設(shè)置指向原來(lái)指向執(zhí)行一次構(gòu)造函數(shù)返回對(duì)象當(dāng)代碼執(zhí)行時(shí),會(huì)發(fā)生以下事情一個(gè)繼承自的新對(duì)象被創(chuàng)建。使用指定的參數(shù)調(diào)用構(gòu)造函數(shù),并將綁定到新創(chuàng)建的對(duì)象。 new 運(yùn)算符創(chuàng)建一個(gè)用戶定義的對(duì)象類型的實(shí)例或具有構(gòu)造函數(shù)的內(nèi)置對(duì)象的實(shí)例。new 關(guān)鍵字會(huì)進(jìn)行如下的操作: 1.創(chuàng)建一個(gè)空的簡(jiǎn)單JavaScript對(duì)...

    lemanli 評(píng)論0 收藏0
  • 再談JavaScript面向?qū)ο笏枷爰袄^承

    摘要:面向?qū)ο笾杏腥筇卣?,封裝,繼承,多態(tài)。這不僅無(wú)法做到數(shù)據(jù)共享,也是極大的資源浪費(fèi),那么引入對(duì)象實(shí)例對(duì)象的屬性指向其構(gòu)造函數(shù),這樣看起來(lái)實(shí)例對(duì)象好像繼承了對(duì)象一樣。實(shí)例對(duì)象的原型指向其構(gòu)造函數(shù)的對(duì)象構(gòu)造器的指向。 前言 為什么說(shuō)是再談呢,網(wǎng)上講解這個(gè)的博客的很多,我開(kāi)始學(xué)習(xí)也是看過(guò),敲過(guò)就沒(méi)了,自以為理解了就結(jié)束了,書到用時(shí)方恨少啊。實(shí)際開(kāi)發(fā)中一用就打磕巴,于是在重新學(xué)習(xí)了之后分享出來(lái)...

    svtter 評(píng)論0 收藏0
  • class 與 原型鏈 解析

    摘要:一相當(dāng)于拿實(shí)例對(duì)象的名字來(lái)給原型命名。不專業(yè)點(diǎn)說(shuō)的實(shí)例函數(shù)為匿名函數(shù),而中,構(gòu)造函數(shù)即原型鏈展示的原型為匿名函數(shù)。關(guān)系圖不通過(guò)創(chuàng)造,不通過(guò)各種情況擾亂的情況下分析為原型屬性,展示構(gòu)造函數(shù),比如上面舉例的某同學(xué)的媽媽構(gòu)造函數(shù)。 這篇文章只是我個(gè)人的見(jiàn)解,因?yàn)橐彩墙衲陝偖厴I(yè),所以理解不一定非常的準(zhǔn)確,如果理解有誤希望大家告訴我。 一、class 相當(dāng)于 拿實(shí)例對(duì)象的名字 來(lái)給 原型 命名。...

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

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

0條評(píng)論

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