Да, мы можем, javascript больше по природе prototype inheritance
.
function Actor(name, age){
this.name = name;
this.age = age;
}
Actor.prototype.name = "unknown";
Actor.prototype.age = "unknown";
Actor.prototype.getName = function() {
return this.name;
};
Actor.prototype.getAge = function() {
return this.age;
};
когда мы создаем объект с "new
", тогда наш созданный объект INHERITS getAge
(), но если мы использовали apply(...) or call(...)
для вызова Actor, тогда мы передаем объект для "this"
, но объект мы передать WON'T
наследовать от Actor.prototype
если только мы не передадим apply или вызовем Actor.prototype, но тогда .... "this" будет указывать на "Actor.prototype", а this.name будет записывать в: Actor.prototype.name
. Это влияет на все другие объекты, созданные с помощью Actor...
, поскольку мы перезаписываем прототип, а не экземпляр
var rajini = new Actor('Rajinikanth', 31);
console.log(rajini);
console.log(rajini.getName());
console.log(rajini.getAge());
var kamal = new Actor('kamal', 18);
console.log(kamal);
console.log(kamal.getName());
console.log(kamal.getAge());
Давайте попробуем с apply
var vijay = Actor.apply(null, ["pandaram", 33]);
if (vijay === undefined) {
console.log("Actor(....) didn't return anything
since we didn't call it with new");
}
var ajith = {};
Actor.apply(ajith, ['ajith', 25]);
console.log(ajith); //Object {name: "ajith", age: 25}
try {
ajith.getName();
} catch (E) {
console.log("Error since we didn't inherit ajith.prototype");
}
console.log(Actor.prototype.age); //Unknown
console.log(Actor.prototype.name); //Unknown
Передав Actor.prototype
в Actor.call()
в качестве первого аргумента, при запуске функции Actor () она выполняет this.name=name
, поскольку «this» будет указывать на Actor.prototype
, this.name=name; means Actor.prototype.name=name;
var simbhu = Actor.apply(Actor.prototype, ['simbhu', 28]);
if (simbhu === undefined) {
console.log("Still undefined since the function didn't return anything.");
}
console.log(Actor.prototype.age); //simbhu
console.log(Actor.prototype.name); //28
var copy = Actor.prototype;
var dhanush = Actor.apply(copy, ["dhanush", 11]);
console.log(dhanush);
console.log("But now we've corrupted Parent.prototype in order to inherit");
console.log(Actor.prototype.age); //11
console.log(Actor.prototype.name); //dhanush
Возвращаясь к первоначальному вопросу, как использовать new operator with apply
, вот мой дубль ....
Function.prototype.new = function(){
var constructor = this;
function fn() {return constructor.apply(this, args)}
var args = Array.prototype.slice.call(arguments);
fn.prototype = this.prototype;
return new fn
};
var thalaivar = Actor.new.apply(Parent, ["Thalaivar", 30]);
console.log(thalaivar);