首页 > 为什么很少看到人用 __proto__ 直接来实现面向对象?

为什么很少看到人用 __proto__ 直接来实现面向对象?

为了证明这种方式是可以用的, 我尝试写了个模块:
https://github.com/jiyinyiyong/proto-scope

human = proto.as
  init: -> @name = 'human race'
  give_name: (@name) ->
  introduce: -> console.log "this is #{@name}"

tom = human.new()
tom.introduce() # => "this is human race"

man = human.as
  speak: ->
    print 'speaks by', @name
dan = man.new()
dan.give_name 'Dan'
dan.introduce() # => "this is Dan"
dan.speak() # => "speaks by Dan"

从功能上说, proto 是可行的, 在 Node 环境里也是正常能跑的,
但是为什么没人在实际使用当中这样用呢?


标准的可以用Object.getPrototypeOfObject.create 来做

问题是,不是可以用的东西就会被用……你需要回答的是“为什么这么做” 因为就你贴代码的那样子的能力,完全不用__proto__或者getPrototypeOf也一样能办到


因为__proto__是prototype在实例上的副本,定义在prototype上的方法能够继承给所有实例,而__proto__只能影响到指定的实例

如果要对单个实例添加方法,直接obj.fn = function() {},比__proto__来得更简单直接,而且还节约了在原型链上的遍历(其实微不足道)

定义到__proto__的确可以工作,但并没有什么好处,当然就没人爱这么干

UPDATE:

我写了段代码测试,我的第一个观点是错误的,__proto__是prototype的直接引用,两者是一致的

那么我的第二个观点也不那么站得住脚……

@TooBug的答案看来更靠谱一点

另外,我认为即使不考虑__proto__非标准的因素,对prototype修改的方式会比修改__proto__更易读和维护


https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Object/proto

红色区三个大字……


可以阅读下 @nightire 凡哥的博文 - 《理解 JavaScript(四)》,里面详细介绍了 prototype__proto__ 以及原型继承等相关问题。

【热门文章】
【热门文章】