一个关于原型书写的问题

我现在有一个对象O,我需要在对象O上面添加一个init方法,书写方式如下:
第一种:

O.prototype = {
    init:function () {
    }
}

第二种:

O.prototype.init = function () {
}

这两种书写方式有什么区别吗?以及在调用上面有什么需要注意的吗?

阅读 2.7k
6 个回答

其实都可以起到的作用到是在o的原型上扩充了方法,但是 如果你方法很多的时候 为了代码的可维护性 健壮性 以及易读性方面的考虑我们还是更多的采用第一种方法, 最起码是普遍大众都在用的方法,希望对你有所帮助

第一种覆盖了原来的prototype

第一种写法相当于给O.prototype赋值,使其指向了一个新的对象;
第二种写法是在原有O.prototype对象的基础上,添加属性;
这两种都可以使用,但使用的时候,最好只用其中一种。一起使用的时候,要注意第一种写法会使之前定义在O.prototype上的方法失效。

等价于下面

let o = {a:1};
o.a = 2;   //地址没变
o = {a:3}  //地址改变了

首先如果你能直接用 第二种 方式,一个合理的猜测是 O 是一个函数,那么使用 第一种 方式会替换掉 prototype 导致其中的 constructor 跟原来不一致。你可以补上(或者刻意改变 constructor 什么的就不在此作讨论了)

O.prototype = {
    constructor: O,
    init:function () {
    }
}

第一种会直接覆盖原有的原型,第二种是往原有的原型增加方法

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