15

有人可以帮我理解这段代码吗?对我来说似乎太复杂了。

var __extends = this.__extends || function (d, b) {
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};


var PageView = (function (_super) {
    "use strict";

    __extends(MyPageView, _super);

 function MyPageView(rootElement, viewModelParameter, calendarWeeksViewModel) {
});


}
4

2 回答 2

15

所以基本上

__extends(MyPageView, _super);

考虑面向对象语言中的继承。一个类正在扩展一个超类或一个基类..

所以基本上这里 MyPageView会扩展超类的功能和实现。

因此,假设基础视图具有method A() and method B()并且当前视图具有方法 C(),那么当前视图可以访问其视图中的所有三个方法 A() , B() and C()

但是假设 MyPageView已经method B()在其中定义了,那么视图内的方法将采用precedence over the Method B() of Super View

var __extends = this.__extends || function (d, b) {
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};

每个函数都有一个神奇的原型属性。

 var __extends = this.__extends || function (d, b) {

检查该函数在该上下文中是否可用,如果没有定义一个函数,则需要 2 个参数,要扩展的对象和扩展它的对象..

function __() { this.constructor = d; }

定义一个调用的新函数__,其中上下文的构造函数属性绑定到object d

 __.prototype = b.prototype;

的原型属性Object __指向b.prototype链..

 d.prototype = new __();

的方法的访问Super View发生在这里,您在这里设置对象的原型属性..

因此,当创建新实例时,如果方法不可用,那么由于prototype 对象上的 ,它将检查方法中的方法,因为它在绑定到Super view的函数上可用__object d

于 2013-05-16T18:55:45.510 回答
0

我也对这段代码感到困惑。
所以我在 chrome 中试试这个,看看控制台显示了什么。
没有“this.constructor = d;” 构造函数是
带有“this.constructor = d;”的 Vector2 构造函数是 Vector3

var __extends = this.__extends || function (d, b) {
    function __() {
        // mark this and try again
        this.constructor = d;
    }
    __.prototype = b.prototype;
    d.prototype = new __();
};

function Vector2(x, y) {
    this.x = x;
    this.y = y;

}

Vector2.prototype.length2 = function () {
    return Math.sqrt(this.x * this.x + this.y * this.y);
}

__extends(Vector3, Vector2)
function Vector3(x, y, z) {
    Vector2.call(this, x, y);
    this.z = z;
}

Vector3.prototype.length3 = function () {
    return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
}

var v2 = new Vector2(1, 1);
var v3 = new Vector3(1, 2, 3);
console.log(v3.constructor.prototype);

你可以和这个
最后比较一下我知道为什么原始代码会这样做

var __extends = this.__extends || function (d, b) {

    d.prototype = b.prototype;
};

我认为原始代码相当于...

var __extends = this.__extends || function (d, b) {
    // function __() {
    //     // mark this and try again
    //     console.log(this);
    //     this.constructor = d;
    // }
    // __.prototype = b.prototype;
    // d.prototype = new __();

    d.prototype.__proto__ = b.prototype;
};
于 2021-10-07T03:14:28.293 回答