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

關于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擴展的函數(shù)為什么會報錯呢
</script>


回答
編輯回答
凝雅

MDN的new運算解釋

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

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

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

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

{
    say1: say
}

這個對象就是一個普通的對象,不是a的實例,所以沒有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