鍍金池/ 問答/C++  網(wǎng)絡(luò)安全  HTML/ 關(guān)于prototype寫插件

關(guān)于prototype寫插件

想用原生js寫插件,js文件名為a.js

//a.js
(function(document, window){
    var a = function(name){
        ...
        var say = function(){
            alert(1);
        }
        return {
            say1: say
        }
    }
    a.prototype.say2 = function(){
        alert(1);
    }
    //暴露出來
    window.a = a;
})(document , window)

主文件引入a.js后

 <script>
     var aa = new a(name);
     aa.say1()  //這種沒問題
     aa.say2()  //利用prototype擴(kuò)展的函數(shù)為什么會報(bào)錯呢
</script>


回答
編輯回答
凝雅

MDN的new運(yùn)算解釋

如果構(gòu)造函數(shù)返回了一個(gè)“對象”,那么這個(gè)對象會取代整個(gè)new出來的結(jié)果。

var aa = new a(name);
也就是說 aa 就是{say1:say}這個(gè)對象了,他是不具有say2的!

2017年3月18日 05:22
編輯回答
陌離殤

當(dāng)一個(gè)函數(shù)作為構(gòu)造函數(shù)使用時(shí),如果函數(shù)沒有明確的返回值,那么在調(diào)用的時(shí)候會生成一個(gè)this,并把這個(gè)this返回,這個(gè)返回值也就是我們所說的實(shí)例。但是當(dāng)你在構(gòu)造函數(shù)中明確返回一個(gè)對象的時(shí)候,這個(gè)對象就會被返回,而不是那個(gè)this,所以在你的例子中你明確返回了一個(gè)對象,所以當(dāng)你調(diào)用new a(name)的時(shí)候,返回值就是

{
    say1: say
}

這個(gè)對象就是一個(gè)普通的對象,不是a的實(shí)例,所以沒有a原型上面的方法,

a instanceof aa // false

clipboard.png

你可以直接把say1放在this上,代碼如下:

(function(document, window){
    var a = function(name){
        ...
        var say = function(){
            alert(1);
        }
        this.say1 = say
    }
    a.prototype.say2 = function(){
        alert(1);
    }
    //暴露出來
    window.a = a;
})(document , window)

clipboard.png

2017年5月11日 14:35