对象伪装如何在Javascript中工作

时间:2015-06-11 09:57:44

标签: javascript

我无法获得这段代码,为什么ClassA方法被分配给ClassB。具体来说,我无法理解ClassB中前两行代码的继承行为。

function ClassA(sColor) {
    this.color = sColor;
    this.sayColor = function () {
    alert(this.color);
    }; 
    this.sayColor1 = function () {
    alert("hi");
    };
}

function ClassB(sColor, sName) {
    this.newMethod = ClassA;
    this.newMethod(sColor);
    delete this.newMethod;
    this.name = sName;
    this.sayName = function () {
    alert(this.name);
    };
}

var objA = new ClassA('red');
var objB = new ClassB('blue', 'Nicholas');
objA.sayColor();  
objB.sayColor(); 
objB.sayColor1();
objB.sayName();

3 个答案:

答案 0 :(得分:2)

您将ClassA指定为ClassB中的实例方法,这不是继承。如果您希望ClassB扩展ClassA,可以通过以下方式执行此操作:

function ClassB(sColor, sName) {
    ClassA.call(this, sColor);
    // do the rest
}

ClassB.prototype = Object.create(ClassA.prototype);

答案 1 :(得分:1)

我会尝试一下解释ClassB

中前两行的情况

在第一行中,属性newMethod引用函数ClassA

    this.newMethod = ClassA; 

然后,在第二行,正在调用该函数,

    this.newMethod(sColor);

在这种情况下,ClassA内的函数引用ClassB中的对象,因此ClassA的所有属性都被添加到创建的对象中。

并且,最后引用被删除

    delete this.newMethod;

你可以这样做,只需写ClassA.call(this,sColor);,而不是这三行

答案 2 :(得分:-1)

问题在于您在JS中实现继承的方式

对象伪装在JS中以这种方式完成:

function ClassA () { 

} 
function ClassB() { 

    this.superclass = ClassA; 

    this.superclass(); 

    delete this.superclass; 
}
ClassB.prototype = new ClassA;

尝试以这种方式实施......

如需更多参考,请查看:

http://www.sitepoint.com/javascript-objects/