按照你的描述,我写了一段代码 (function(window) { function Fn(param) { if(!(this instanceof Fn)) return new Fn(param); return Fn.prototype.init.call(this,param); } Fn.prototype = { constructor: Fn, init: function(param) { this.param = param; return this; }, sayParam: function() { console.log(this.param); }, sayContext: function() { console.log('this instanceof init: ' + (this instanceof this.init)); console.log('this instanceof Fn: ' + (this instanceof Fn)); } } Fn.prototype.init.prototype = Fn.prototype; window.Fn = Fn; })(window); var o = Fn('Hello'); o.sayParam() //Hello o.sayContext(); //this instanceof init: true //this instanceof Fn: true 将以上代码直接粘贴到浏览器的控制台 注意我这里创建对象的方式是直接调用 var o = Fn('Hello'); 不是 var o = new Fn('Hello');当然,效果一样,为什么会一样呢?1 为什么用原型创建对象通过原型可以让函数只有一个备份,而不是每个对象都有一个备份2 为什么用 init在 js 中函数可以当做 构造函数(new Fn())和普通函数来(Fn())来调用,而我写了一个函数让别人去用别人可能不知道这个函数要按那种方式来调用,而在一个函数内部的代码可以分为两部分,第一部分是作为普通函数的执行语句,第二部分是作为构造函数的部分,通过使用 init 来将这两部分来显示的区分职责,在 init 中只做初始化操作 而在 Fn 中可以有其它的计算,通过上面的处理,还有一个好处就是无论用户用那种方式来调用 Fn 都会保证不会出错。(new Fn() 和 Fn() 具有相同的效果)3 为什么用 apply你说的 apply 和 call 功能相同,作用是绑定函数的上下文具体,可以参照 JavaScript this 从此不再疑惑
按照你的描述,我写了一段代码
将以上代码直接粘贴到浏览器的控制台
注意我这里创建对象的方式是直接调用
var o = Fn('Hello');
不是var o = new Fn('Hello');
当然,效果一样,为什么会一样呢?1 为什么用原型创建对象
通过原型可以让函数只有一个备份,而不是每个对象都有一个备份
2 为什么用
init
在 js 中函数可以当做 构造函数(
new Fn()
)和普通函数来(Fn()
)来调用,而我写了一个函数让别人去用别人可能不知道这个函数要按那种方式来调用,而在一个函数内部的代码可以分为两部分,第一部分是作为普通函数的执行语句,第二部分是作为构造函数的部分,通过使用init
来将这两部分来显示的区分职责,在init
中只做初始化操作 而在Fn
中可以有其它的计算,通过上面的处理,还有一个好处就是无论用户用那种方式来调用Fn
都会保证不会出错。(new Fn()
和Fn()
具有相同的效果)3 为什么用
apply
你说的
apply
和call
功能相同,作用是绑定函数的上下文具体,可以参照 JavaScript this 从此不再疑惑