constructor
jest regularne własność obiektu prototypu (z DontEnum
ustaw flagę, aby nie pojawiała się w pętlach for..in
). Jeśli zamienisz obiekt prototypowy, właściwość constructor
również zostanie wymieniona - więcej informacji znajdziesz w artykule this explanation.
Możesz obejść problem, ręcznie ustawiając Obj2.prototype.constructor = Obj2
, ale w ten sposób flaga DontEnum
nie zostanie ustawiona.
Z tego powodu nie jest dobrym pomysłem poleganie na sprawdzaniu typu: constructor
: zamiast tego użyj instanceof
lub isPrototypeOf()
.
Andriej Fiodorow postawił pytanie dlaczego new
nie przypisać właściwość constructor
do obiektu instancji zamiast. Sądzę, że powodem tego są następujące linie:
Wszystkie obiekty utworzone z tej samej funkcji konstruktora współdzielą własność konstruktora, a właściwości wspólne znajdują się w prototypie.
Prawdziwym problemem jest to, że JavaScript nie ma wbudowanej obsługi hierarchii dziedziczenia. Istnieje kilka sposobów na całym numerze (twój jest jednym z nich), inny więcej jeden „w duchu” JavaScriptu byłby następujący:
function addOwnProperties(obj /*, ...*/) {
for(var i = 1; i < arguments.length; ++i) {
var current = arguments[i];
for(var prop in current) {
if(current.hasOwnProperty(prop))
obj[prop] = current[prop];
}
}
}
function Obj1(arg1) {
this.prop1 = arg1 || 1;
}
Obj1.prototype.method1 = function() {};
function Obj2(arg1, arg2) {
Obj1.call(this, arg1);
this.test2 = arg2 || 2;
}
addOwnProperties(Obj2.prototype, Obj1.prototype);
Obj2.prototype.method2 = function() {};
To sprawia, wielokrotnego dziedziczenia trywialne, jak również.
'constructor' jest nieruchomość, która jest dzielona pomiędzy wszystkich instancji obiektów utworzona z tego samego konstruktora, dlatego dobrze jest umieścić go w prototypie; Po prostu JS nie ma wbudowanej obsługi hierarchii dziedziczenia (głębokiego) - dodam wyjaśnienie do mojej odpowiedzi ... – Christoph