关于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扩展的函数为什么会报错呢
</script>


阅读 3k
2 个回答

当一个函数作为构造函数使用时,如果函数没有明确的返回值,那么在调用的时候会生成一个this,并把这个this返回,这个返回值也就是我们所说的实例。但是当你在构造函数中明确返回一个对象的时候,这个对象就会被返回,而不是那个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

MDN的new运算解释

如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。

var aa = new a(name);
也就是说 aa 就是{say1:say}这个对象了,他是不具有say2的!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题