Javascript快速原型继承

Javascript fast prototypal inheritance?

本文关键字:继承 原型 Javascript      更新时间:2023-09-26

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

我试着自己写,结果似乎奏效了。也许我误解了什么,也许出于某种原因,这被认为是不好的做法。有经验的人能分享他对这种方法的想法吗?

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

EDIT:有一件事我仍然觉得很笨拙,那就是对基类函数的调用,比如C.base.constructor.call(this);。我真的不明白为什么当我们做C.base.constructor()时,this没有得到正确的绑定。

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

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的微面向对象框架提供了另一个视角,这里是:

https://github.com/foo123/classy.js

它还支持sweet.js宏(以及es5/es6高级功能),从而产生类似于Java或PHP的OOP语法糖,无论是语法还是功能

PS。我是的作者

classy.js的jsperf性能测试(以及类似的方法,例如@ejohn的面向对象方法)