【发布时间】:2012-05-09 16:39:00
【问题描述】:
我在使用 Knockout 时遇到问题,我在原型中创建了一个用户对象,其中我的对象的可观察属性似乎被最后一次出现覆盖了。
因此我不能多次使用同一个对象,否则它将被覆盖。
虽然这很难解释,但请看我的小提琴。
我做错了什么? (或者这是 Knockout 中的错误?)我该如何解决这个问题。
【问题讨论】:
标签: javascript inheritance knockout.js prototype
我在使用 Knockout 时遇到问题,我在原型中创建了一个用户对象,其中我的对象的可观察属性似乎被最后一次出现覆盖了。
因此我不能多次使用同一个对象,否则它将被覆盖。
虽然这很难解释,但请看我的小提琴。
我做错了什么? (或者这是 Knockout 中的错误?)我该如何解决这个问题。
【问题讨论】:
标签: javascript inheritance knockout.js prototype
因为可观察对象是函数而不是属性,所以它们由对象原型上的单个实例表示,这与设置对象时将在对象上创建的属性不同。
你可以使用函数继承来实现你想要的。
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;
};
希望这会有所帮助。
【讨论】:
这是一个不错的解决方案: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);
【讨论】:
我知道有点晚了,但这可能会对某人有所帮助。
尝试这样定义它,对我来说总是一种享受
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;
【讨论】: