Javascript快速原型(prototype)继承?

标签 javascript

我正在学习 JavaScript,我发现它的原型(prototype)继承方式太冗长了。所以我搜索了一些替代方案,但我发现的所有东西都使用了闭包,并因此显着降低了性能。

我尝试自己编写,它似乎有效。也许我误解了什么,或者出于某种原因这被认为是不好的做法。有更多经验的人可以分享他对这种方法的看法吗?

var Class = {
  constructor: function() {},
  extend: function(properties) {
    var base = this.prototype || Class;
    var constructor = properties.hasOwnProperty('constructor') ?
      properties.constructor : base.constructor;
    constructor.base = base;
    constructor.prototype = Object.create(base);
    constructor.extend = Class.extend;
    for(var p in properties) {
      constructor.prototype[p] = properties[p];
    }
    constructor.prototype.constructor = constructor;
    return constructor;
  }
};

现场演示:http://jsfiddle.net/xNGAB/

性能:http://jsperf.com/object-construction99/2

编辑:我仍然觉得笨拙的一件事是对基类函数的调用,例如 C.base.constructor.call(this);。我真的不明白为什么 this 在我们执行 C.base.constructor() 时没有得到正确的绑定(bind)。

最佳答案

你应该看看CoffeeScript .它具有类似 Ruby 的语法并编译成 JavaScript。最好的部分是您可以像这样实现原型(prototype)继承(来自他们的用户手册):

class Animal
  constructor: (@name) ->

  move: (meters) ->
    alert @name + " moved #{meters}m."

class Snake extends Animal
  move: ->
    alert "Slithering..."
    super 5

class Horse extends Animal
  move: ->
    alert "Galloping..."
    super 45

sam = new Snake "Sammy the Python"
tom = new Horse "Tommy the Palomino"

关于Javascript快速原型(prototype)继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9250085/

相关文章:

javascript - 如何在弹出窗口中插入关闭按钮

javascript - RAZOR - 从包含 HTML 的变量中删除图像标签

javascript - 无法将整个 HTML 内容放入 iframe

javascript - 使用 Javascript 客户端进行 REST 基本身份验证的安全缺陷是什么(如果有)?

javascript - 如何让 Firefox 控制台显示超过 200 个日志条目?

javascript - 播放时编辑 ffmpeg 参数

javascript - CSS 中的元素位置

javascript - Firebase 的用户数据结构

javascript - JavaScript 会编译成二进制吗?

javascript - 如何将div定位在父div的右侧