Rumah  >  Soal Jawab  >  teks badan

javascript - 为什么很少看到人用 __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 环境里也是正常能跑的,
但是为什么没人在实际使用当中这样用呢?

天蓬老师天蓬老师2749 hari yang lalu390

membalas semua(4)saya akan balas

  • 阿神

    阿神2017-04-10 14:26:56

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

    红色区三个大字……

    balas
    0
  • PHP中文网

    PHP中文网2017-04-10 14:26:56

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

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

    balas
    0
  • 巴扎黑

    巴扎黑2017-04-10 14:26:56

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

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

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

    UPDATE:

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

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

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

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

    balas
    0
  • ringa_lee

    ringa_lee2017-04-10 14:26:56

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

    balas
    0
  • Batalbalas