javascript - 在 JS 中编写原型(prototype)继承的最简洁方法

标签 javascript syntax prototype

我仍然是一个 JS 新手,我正在尝试了解使用原型(prototype)和继承的最佳/最干净的方法。

通常我会这样编写对象/原型(prototype)定义:

var Foo = function(data) {
  this.data = data;
};
Foo.prototype = {
  someMethod: function() {
    return "whatever";
  }
};

我喜欢这个,因为我经常使用几层深度的命名空间对象,所以它实际上可能看起来更像这样:

App.Model.FooModel = function(){...};
App.Model.FooModel.prototype = {...};

这很好,因为我不必输入每个方法的全名来编写原型(prototype),只需输入名称即可,即。 someMethod: function(){} 而不是 App.Model.FooModel.prototype.someMethod = function(){}

现在,我遇到的问题是我不知道如何在 JS 中使用继承来做到这一点。如果我这样做,我可以让继承工作正常:

var Child = function(){...};
Child.prototype = new Parent;
Child.prototype.someMethod = function(){...};

...但现在在一个更复杂的应用程序中,我们又回到为每个方法写出对象的全名,我发现这既乏味又难以阅读。

所以,我的问题是:除了使用对象的全名附加所有子方法之外,是否有一种干净、直接的方法来编写从另一个对象继承的原型(prototype)?

谢谢!

最佳答案

嗯,这是 javascript,你可以随时编写自己的:

function construct ( parent, fn, attr ) {
    fn.prototype = new parent();

    for (var x in attr) {
        fn.prototype[x] = attr[x];
    }
    return fn;
}

如果需要,您可以执行 hasOwnProperty 检查,但为了清楚起见,上面是最简单的实现。该函数将三个步骤封装为一个。您现在可以简单地执行以下操作:

var Foo = construct(
    Parent,
    function(data) {
        this.data = data;
    },
    {
        someMethod: function() {
            return "whatever";
        }
    }
);

如果您不喜欢这种语法,您随时可以想出更好的语法。另一种实现是简单地实现 attr 扩展部分并正常进行继承:

function extend (obj, attr) {
    for (var x in attr) {
        obj.prototype[x] = attr[x];
    }
    return obj;
}

为了清晰起见,再次进行了简化。所以语法现在变成:

var Foo = function(){...};
Foo.prototype = new Parent;
extend(Foo.prototype,{
    someMethod : function(){...}
});

关于javascript - 在 JS 中编写原型(prototype)继承的最简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15513425/

相关文章:

javascript - 我无法从 xml 读取数据

javascript - 如何在 JavaScript/jQuery 上合并音频和视频 blob?

python - 确定两个或多个 boolean 评估全部为 False 的 pythonic 方法是什么?

JavaScript:将 "this"分配给原型(prototype)函数

javascript - 向原生 JavaScript 对象添加方法对性能有何影响?

javascript - d3.js 图例重叠图表区域

php - 如何将每个 php foreach 值放入每个 jquery ajax

syntax - 拼接语法参数化禁用 Typed Racket 类型注释

SQL JOIN : is there a difference between USING, ON 或 WHERE?

javascript - 为什么方法括号内的函数声明会产生 method.variableName()?