【问题标题】:How to do inheritance with JavaScript object literals?如何使用 JavaScript 对象字面量进行继承?
【发布时间】:2012-01-01 03:59:49
【问题描述】:

您好,我在使用对象字面量语法声明对象原型时遇到了一个问题。

我已经制作了两个小提琴来帮助你帮助我。

这是我的基类,几乎所有对象在我的应用程序中都是这样定义的:

Base = function(param){
    this.init(param);
}
Base.prototype = {
    init: function(param){
        this.param = param;
    },
    calc: function(){
        var result = this.param * 10;
        document.write("Result from calc in Base: " + result + "<br/>");
    },
    calcB: function(){
        var result = this.param * 20;
        document.write("Result from calcB in Base: " + result+ "<br/>");
    }
}

这就是我在 Base 中成功扩展和覆盖方法的方式:

Extend = function(param){
    this.init(param);
}
Extend.prototype = new Base();

Extend.prototype.calc = function(){
    var result = this.param * 50;
    document.write("Result from calc in Extend: " + result+ "<br/>");
}

但是我想使用与应用程序的其余部分相同的样式,所以我开始使用对象文字,但它让我发疯,因为 eclipse 和 firebug 对我的语法的无意义响应而热切地欢呼。

现在的问题是如何将成功的扩展代码转换为对象字面量样式? 这是众多尝试之一(它不会编译,但会让您大致了解我希望代码的外观。)

Extend = function(param){
    this.init(param);
}
Extend.prototype = {
    : new Base(),
    calc: function(){
        var result = this.param * 50;
        document.write("Result from calc in Extend: " + result+ "<br/>");
    }
}

【问题讨论】:

  • 我不明白你在做什么。 JSON 是一种文本数据格式,与对象继承无关。您可能是指 JavaScript 文字对象表示法吗?
  • 这很可能就是我的意思,JavaScript 的正确术语不是我的强项。这也是为什么我没有说 JSON 而是 JSON 样式的原因。
  • @Farmor "我想用对象字面量编程"。
  • 我对问题进行了一些小的修改,将术语更改为“对象文字”。还是应该是“对象文字”?我认为从现在开始应该是“对象文字”。

标签: javascript oop inheritance


【解决方案1】:

您需要扩展原始原型,而不是分配一个新对象作为原型。

function extend(original, extension) {
  for (var key in extension) {
    if (extension.hasOwnProperty(key)) {
      original[key] = extension[key];
    }
  }
};

var A = function () {};
var B = function () {};
B.prototype = new A();
extend(B.prototype, {
   methodName: function () {}
});

【讨论】:

    【解决方案2】:

    你想要Object.makeLive Example

    Extend = function(param){
        this.init(param);
    }
    Extend.prototype = Object.make(Base.prototype, {
        constructor: Extend,
        calc: function(){
            var result = this.param * 50;
            document.write("Result from calc in Extend: " + result+ "<br/>");
        }
    });
    

    如果您希望 Object.make 的 ES5 兼容实现仅插入到您的代码中,请使用

    Object.make = function make (proto) {
        var o = Object.create(proto);
        var args = [].slice.call(arguments, 1);
        args.forEach(function (obj) {
            Object.getOwnPropertyNames(obj).forEach(function (key) {
                o[key] = obj[key];
            });
        });
        return o;
    }
    

    【讨论】:

    • 在测试过程中我发现 IE8 不支持 ES5/Object.create 这可以通过在 IE8 中打开小提琴来轻松验证。我正在解决这个问题,并将提供解决方案。
    猜你喜欢
    • 2013-02-22
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2019-01-30
    • 1970-01-01
    • 2014-02-23
    • 2015-09-30
    相关资源
    最近更新 更多