재정의 된 경우 JavaScript의 프로토 타입 메소드에서 기본 메소드를 호출 할 수 있습니까?
MyClass = function(name){
this.name = name;
this.do = function() {
//do somthing
}
};
MyClass.prototype.do = function() {
if (this.name === 'something') {
//do something new
} else {
//CALL BASE METHOD
}
};
답변
정확히 무엇을하려고하는지 이해하지 못했지만 일반적으로 객체 별 동작을 구현하는 것은 다음 라인을 따라 수행됩니다.
function MyClass(name) {
this.name = name;
}
MyClass.prototype.doStuff = function() {
// generic behaviour
}
var myObj = new MyClass('foo');
var myObjSpecial = new MyClass('bar');
myObjSpecial.doStuff = function() {
// do specialised stuff
// how to call the generic implementation:
MyClass.prototype.doStuff.call(this /*, args...*/);
}
답변
이를 수행하는 한 가지 방법은 기본 메소드를 저장 한 다음 대체 메소드에서이를 호출하는 것입니다.
MyClass.prototype._do_base = MyClass.prototype.do;
MyClass.prototype.do = function(){
if (this.name === 'something'){
//do something new
}else{
return this._do_base();
}
};
답변
나는 당신의 모범이 당신의 생각대로 작동하지 않을까 두려워합니다. 이 부분:
this.do = function(){ /*do something*/ };
의 정의를 덮어 씁니다.
MyClass.prototype.do = function(){ /*do something else*/ };
새로 작성된 오브젝트에는 이미 “do”특성이 있으므로 프로토 타입 체인을 찾지 않습니다.
Javascript의 고전적인 상속 형태는 어색하며 파악하기가 어렵습니다. Douglas Crockfords 간단한 상속 패턴을 대신 사용하는 것이 좋습니다. 이처럼 :
function my_class(name) {
return {
name: name,
do: function () { /* do something */ }
};
}
function my_child(name) {
var me = my_class(name);
var base_do = me.do;
me.do = function () {
if (this.name === 'something'){
//do something new
} else {
base_do.call(me);
}
}
return me;
}
var o = my_child("something");
o.do(); // does something new
var u = my_child("something else");
u.do(); // uses base function
제 생각에는 자바 스크립트에서 객체, 생성자 및 상속을 처리하는 훨씬 명확한 방법입니다. Crockfords Javascript : The good parts 에서 더 많은 내용을 읽을 수 있습니다 .
답변
나는이 게시물이 4 년 전이라는 것을 알고 있지만 C # 배경으로 인해 클래스 이름을 지정하지 않고 기본 클래스를 호출하는 방법을 찾고 있었지만 하위 클래스의 속성으로 가져옵니다. 그래서 Christoph의 대답에 대한 나의 유일한 변화 는
이것으로부터:
MyClass.prototype.doStuff.call(this /*, args...*/);
이에:
this.constructor.prototype.doStuff.call(this /*, args...*/);
답변
이와 같은 함수를 정의하면 (OPP 사용)
function Person(){};
Person.prototype.say = function(message){
console.log(message);
}
프로토 타입 함수를 호출하는 두 가지 방법이 있습니다. 1) 인스턴스를 만들고 객체 함수를 호출합니다.
var person = new Person();
person.say('hello!');
그리고 다른 방법은 … 2) 프로토 타입에서 직접 함수를 호출하는 것입니다.
Person.prototype.say('hello there!');
답변
이 솔루션은 Object.getPrototypeOf
TestA
가지고있는 슈퍼 getName
TestB
재정의하는 아이입니다 getName
만, 또한이
getBothNames
그 통화량 super
의 버전 getName
뿐만 아니라 child
버전
function TestA() {
this.count = 1;
}
TestA.prototype.constructor = TestA;
TestA.prototype.getName = function ta_gn() {
this.count = 2;
return ' TestA.prototype.getName is called **';
};
function TestB() {
this.idx = 30;
this.count = 10;
}
TestB.prototype = new TestA();
TestB.prototype.constructor = TestB;
TestB.prototype.getName = function tb_gn() {
return ' TestB.prototype.getName is called ** ';
};
TestB.prototype.getBothNames = function tb_gbn() {
return Object.getPrototypeOf(TestB.prototype).getName.call(this) + this.getName() + ' this object is : ' + JSON.stringify(this);
};
var tb = new TestB();
console.log(tb.getBothNames());
답변
function NewClass() {
var self = this;
BaseClass.call(self); // Set base class
var baseModify = self.modify; // Get base function
self.modify = function () {
// Override code here
baseModify();
};
}