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

在javascript中打破原型链的副作用是什么?,javascript,Javascript,我们编写了大量JavaScript代码,使用名为TestComplete的工具运行自动化测试。在一些情况下,我使用以下语法设置了继承树: 函数父函数() { ... //这里的一些内联代码在对象创建时执行 } Child.prototype=Parent; Child.prototype.constructor=Child; 函数子() { 家长。打电话(这个); ... } 我使用的原因 Child.prototype = Parent; 而不是 Child.prototype = new

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

函数父函数()
{
...
//这里的一些内联代码在对象创建时执行
}
Child.prototype=Parent;
Child.prototype.constructor=Child;
函数子()
{
家长。打电话(这个);
...
}
我使用的原因

Child.prototype = Parent;
而不是

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

然而,我怀疑,我这样做实际上打破了原型链,而我们定义的所有方法都是内联定义的(即在构造函数中),而不是使用object.prototype.method=。。。语法,因此链断开的事实没有被注意到

所以我有两个问题,;我是否已经断开了链,在JavaScript中断开原型链的副作用是什么?

当您像这样“断开”原型链时,您无法访问
Parent.prototype.
子实例中的方法和属性,
instanceof
操作符不起作用(
new Child()父对象的实例===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;

好的,这段代码将为您运行,并允许访问原型。它涉及将父对象设置为对象文字,并且可以在子对象的“构造函数”中调用原型方法

如果你想去掉“new”,你可以使用Object.create()


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

a好的,您不能断开原型链,因为所有东西都将从对象继承,这意味着始终有一个回到对象的链。你能澄清一下你所说的断链是什么意思吗?当然。看看这把小提琴。您将注意到,仅显示第一个警报。如果改为使用new Parent(),则所有三个警报都将显示。这是一个巧妙的技巧,我将尝试一下。我希望hasOwnProperty方法在链断开时也不起作用。你还能想到别的吗?
hasOwnProperty
是从
Object
继承来的,所以它可以工作。但是
Parent.prototype.isPrototypeOf(new Child())===false仍然有效,但是我失去了创建不同父实例的能力。在某些情况下,我想创建多个父对象。请参阅我修改后的答案中的Object.create()。更接近于此,但现在我丢失了子构造函数(例如testMethod2)。而且,它不会在创建时执行代码,这是我需要做的事情。如果你真的想使用构造函数,那么这种编码风格将不适合你。。。但是你不应该失去testMethod2。我只是在JSFIDLE中重新检查了它,它对我有效;我看错了你的代码,testMethod2在那里,但它现在是一个父方法。在小提琴的例子中,它是Child的一种方法。我想您可能想做的是child1.testMethod2=function(){alert('testMethod2');}。这无疑是一种更“javascripty”的原型方法。
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();
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();
    };