在javascript中打破原型链有什么副作用?

时间:2011-11-18 07:47:08

标签: javascript

我们使用名为TestComplete的工具编写了大量JavaScript代码来运行我们的自动化测试。在某些情况下,我使用以下语法设置了继承树:

function Parent()
{
    ...
    //some inline code here executes on object creation
}

Child.prototype = Parent;
Child.prototype.constructor = Child;
function Child()
{
    Parent.call(this);
    ...
}

我使用

的原因
Child.prototype = Parent;

而不是

Child.prototype = new Parent();

是因为在某些情况下,在父级中创建新对象时会执行代码。以这种方式设置原型从来就不是问题,因为我总是能够在创建Child之后调用Parent中定义的所有函数。

但是,我怀疑,实际上我已经打破了原型链,并且我已经通过以下事实得到了保存:我们定义的所有方法都是内联定义的(即在构造函数内部)并且不使用对象.prototype.method = ...语法,所以链被破坏的事实没有被注意到。

所以我有两个问题;我打破了链条,在JavaScript中打破原型链的副作用是什么?

2 个答案:

答案 0 :(得分:2)

当你“破坏”这样的原型链时,你无法访问Parent.prototype.*个实例中的Child方法和属性,instanceof运算符不起作用(new Child() instanceof Parent === false

我理解为什么您不想使用new关键字进行继承。但是,在没有执行父构造函数的情况下继承父进程的原型有一点小技巧:

var Parent = function () { ... };
var Child = function () {
  Parent.call(this);
  ...
};

var Fn = function () {};
Fn.prototype = Parent.prototype;
Child.prototype = new Fn();
Child.prototype.constructor = Child;

答案 1 :(得分:0)

好的,此代码将为您运行并允许访问原型。它涉及使父对象成为对象,你可以在你孩子的“构造函数”中调用原型方法

var Parent = {
    testMethod1 : function() {
        alert('testMethod1');
    }
}

Parent.testMethod2 = function() {alert('testMethod2');}

Child.prototype = Parent;
//Child.prototype.constructor = Child;
function Child()
{
    alert('im ready');
    Child.prototype.testMethod1();  
}


var child1 = new Child();
child1.testMethod1();
child1.testMethod2();

Parent.testMethod3 = function() {alert('testMethod3');}
child1.testMethod3();

如果您想取消'新',可以使用Object.create()

var Parent = {
    testMethod1 : function() {
        alert('testMethod1');
    }
}

Parent.testMethod2 = function() {alert('testMethod2');}

var child1 = Object.create(Parent);
child1.testMethod1();
child1.testMethod2();

Parent.testMethod3 = function() {alert('testMethod3');}
child1.testMethod3();

Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };

在第二种情况下,你需要在创建()对象后调用一个函数作为你的“构造函数”,但这是真正的原型继承。