为了证明这种方式是可以用的, 我尝试写了个模块:
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 环境里也是正常能跑的,
但是为什么没人在实际使用当中这样用呢?
阿神2017-04-10 14:26:56
https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Object/proto
红色区三个大字……
PHP中文网2017-04-10 14:26:56
标准的可以用Object.getPrototypeOf
和 Object.create
来做
问题是,不是可以用的东西就会被用……你需要回答的是“为什么这么做” 因为就你贴代码的那样子的能力,完全不用__proto__
或者getPrototypeOf
也一样能办到
巴扎黑2017-04-10 14:26:56
因为__proto__是prototype在实例上的副本,定义在prototype上的方法能够继承给所有实例,而__proto__只能影响到指定的实例
如果要对单个实例添加方法,直接obj.fn = function() {},比__proto__来得更简单直接,而且还节约了在原型链上的遍历(其实微不足道)
定义到__proto__的确可以工作,但并没有什么好处,当然就没人爱这么干
我写了段代码测试,我的第一个观点是错误的,__proto__是prototype的直接引用,两者是一致的
那么我的第二个观点也不那么站得住脚……
@TooBug的答案看来更靠谱一点
另外,我认为即使不考虑__proto__非标准的因素,对prototype修改的方式会比修改__proto__更易读和维护
ringa_lee2017-04-10 14:26:56
可以阅读下 @nightire 凡哥的博文 - 《理解 JavaScript(四)》,里面详细介绍了 prototype
和 __proto__
以及原型继承等相关问题。