【问题标题】:Knockout issue with prototypical inheritance原型继承的淘汰赛问题
【发布时间】:2012-05-09 16:39:00
【问题描述】:

我在使用 Knockout 时遇到问题,我在原型中创建了一个用户对象,其中我的对象的可观察属性似乎被最后一次出现覆盖了。

因此我不能多次使用同一个对象,否则它将被覆盖。

虽然这很难解释,但请看我的小提琴。

http://jsfiddle.net/RSEcj/1/

我做错了什么? (或者这是 Knockout 中的错误?)我该如何解决这个问题。

【问题讨论】:

    标签: javascript inheritance knockout.js prototype


    【解决方案1】:

    因为可观察对象是函数而不是属性,所以它们由对象原型上的单个实例表示,这与设置对象时将在对象上创建的属性不同。

    你可以使用函数继承来实现你想要的。

    http://jsfiddle.net/ypWQN/1/

    var User = function(firstName, lastName){
        var that = {};
    
        that.firstName = ko.observable(firstName);
        that.lastName = lastName;
    
        return that;
    };
    
    
    var Employee = function(firstName, lastName){
        var that = User();
    
        that.firstName(firstName);
        that.lastName = lastName; 
    
        return that;
    };
    

    希望这会有所帮助。

    【讨论】:

    • 所以如果我理解正确的话,prototype不能和KnockOut一起使用?
    • 如果您希望可观察对象对每个实例都是独立的,则不是。这不是KO的错。这就是js的工作方式。
    • 这个方法工作得很好,唯一的缺点是instanceof总是指向根函数。
    【解决方案2】:

    这是一个不错的解决方案:http://jsfiddle.net/magikMaker/RSEcj/19/

    它使用了新的方法 inheritsFrom(),感谢 http://phrogz.net/js/classes/OOPinJS2.html

    将它与 apply() 方法和 init() 方法结合起来,神奇的事情发生了...... :-)

    var Person = function(firstName, lastName){
    
        this.init = function(firstName, lastName){
            this.firstName = ko.observable(firstName);
            this.setLastName(lastName);
        };
    
        this.setLastName = function(lastName){
            this.lastName = lastName;
        };
    
        this.init.apply(this, arguments);
    };
    
    var Child = function(firstName, lastName){
        this.init.apply(this, arguments);
    };
    
    Child.inheritsFrom(Person);
    

    【讨论】:

    • 看起来不错,唯一的问题是您无法从子类访问父类的构造函数,例如在调用父构造函数之前运行代码。这是 js 中很常见的做法
    【解决方案3】:

    我知道有点晚了,但这可能会对某人有所帮助。

    尝试这样定义它,对我来说总是一种享受

    function User(firstName,lastName)
    {
    this.firstName = ko.observable(firstName);
    this.lastName = lastName;
    }
    
    function Employee(firstName,lastName)
    {
        User.apply(this,arguments);
       this.firstName(firstName);
        this.lastName = lastName;
    }
    
    Employee.prototype = Object.create(User.prototype);
    Employee.prototype.constructor = Employee;
    

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 2015-03-30
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多