javascript - 使用 Knockout.js 进行继承

标签 javascript inheritance knockout.js

我有一些这样的代码:

var A = function(a,b,c) {
  var self = this;
  self.a = ko.observable(a);
  ... 


  self.function1 = ko.computed(function () {
      dothing(a);
      ...
  } 

  self.function2 = ko.computed(function () {
      dothing(b);
      ...
  }
}

var B = function(a,b,c,d) {
    var self = this;
  self.a = ko.observable(a);
  ... 


  self.function1 = ko.computed(function () {
      dothing(a);
      ...
  } 

  self.function2 = ko.computed(function () {
      dothing(b);
      ...
  }
}

如何将 function1 和 function2 “提取”到 A 和 B 可以共享的函数中?

最佳答案

这正是原型(prototype)的用武之地:

function AB()
{};//empty object
AB.prototype.function1 = function()
{
    var self = this;//doesn't have access to self, but `this` will point to either A or B
    //do stuff
};
var A = function()
{
    var self = this;//constructor
}
var B = function()
{
    var self = this;//constructor
}
A.prototype = new AB;
A.prototype.constructor = A;
B.prototype = new AB;
B.prototype.constructor = B;
//marginally shorter:
A.prototype = B.prototype = new AB;
A.prototype.constructor = A;
B.prototype.constructor = B;
//instances:
var foo = new A();
var bar = new B();
console.log(foo.function1 === bar.function1);//logs true

话虽如此,就我个人而言,我更喜欢定期定义我的构造函数:

function A()
{
    var self = this;
}
foo = new A();
console.log(Object.getPrototypeOf(foo).constructor.name);//logs A

而您的代码将匿名函数分配给变量,这意味着构造函数没有名称:

foo = new A();
console.log(Object.getPrototypeOf(foo).constructor.name);//logs ''

这并不是什么大不了的事,但只是让你知道......


从全局(或任何其他)范围引用方法:

var virtualNewFunction = new A();//create object
virtualNewFunction = virtualNewFunction.function1;//virtualNewFunction now references function1
virtualNewFunction();

闭包仍然可以访问(暴露),但是非常小心this:

A = function()
{
    var self = this;
    this.function1 = function()
    {
        console.log(this);
        console.log(self);
    };
}
foo = new A();
foo.function1();//logs A twice
foo = foo.function1
foo();//logs this -> window! self => A

另一种可能性是“借用”函数:

A = function()
{
    var self = this;
    this.function1 = function()
    {
        console.log(this);
        console.log(self);
    };
}
B = function()
{//no method
    var self = this;
}
foo = new A();
bar = new B();
foo.function1.apply(bar,[]);//call as though function1 was method of B

再次注意:在本例中 this 记录 B,但 self 仍然引用 A!您可以建立某些“安全网”:

    this.function1 = function()
    {
        self = this !== window && this !== self ? this : self;//redefine self to current caller object, unless it's window 
        console.log(this);
        console.log(self);
    };

但说实话,你可能会做得很好 reading up on the this operator掌握所有这些引用技巧。一旦掌握了基础知识,这并不那么难。另请检查 callapply方法了解有关如何“共享/借用”方法的更多详细信息

关于javascript - 使用 Knockout.js 进行继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12675276/

相关文章:

javascript - div 仅在调试时显示

knockout.js - 在嵌套循环中获取祖 parent 的 $index

javascript - 通过 Browserify 加载 HTML 模板以与 knockout 组件一起使用

javascript - 有没有办法实现多色边框

javascript - 获取 chrome 中所有打开的标签页的 url,并将其发送到网络服务

c# - 从实例变量访问类的静态方法?

c++ - 以成员函数启动线程(带继承)

c# - RegisterClientScriptBlock 不完整的 JS 脚本标签

javascript - 将对象值转换为新数组

Ruby 获取继承类