2013-09-12 4 views
0

Пытаясь понять, как наследование может быть сделано в Javascript, я наткнулся на множество различных реализаций, включая Crockfords, Resigs, Prototype, klass и другие.Наследование Javascript с доступом ко всем * методам в «суперклассе»?

Что я пропустил (я готовиться себя к шуму) был Smalltalkish самостоятельной/супер пара: self играет такую ​​же роль, чем this, а именно, представляющей текущий «объект», и super со ссылкой на суперклассе-только версии this ,

[Пропустить «]», если вы знаете, что super делает в Smalltalk: Предположим, что Subclass имеет перекрываться method1 определено в Superclass, я все еще могу получить доступ к суперкласса реализации с использованием super.method1() в Subclass.method2(). Это не будет выполнять код Subclass.method1().

function Superclass() { 
} 
Superclass.prototype.method1 = function() { 
    return "super"; 
} 

function Subclass() { 
} 
Subclass.prototype.method1 = function() { 
    return "sub"; 
} 
Subclass.prototype.method2 = function() { 
    alert (super.method1()); 
} 

var o = new Subclass; 
o.method2(); // prints "super" 

]

Есть ли пакет "Javatalk" там? До сих пор я видел только эмуляции OO в Javascript, которые предоставляют доступ к реализации суперкласса текущего метода (method2), а не другие (например, method1).

Спасибо, NOBI

ответ

0

Существует так много способов реализовать функцию super в JavaScript.Например:

function SuperClass(someValue) { 
    this.someValue = someValue; 
} 

SuperClass.prototype.method1 = function() { 
    return this.someValue; 
}; 

function SubClass(someValue) { 
    //call the SuperClass constructor 
    this.super.constructor.call(this, someValue); 
} 

//inherit from SuperClass 
SubClass.prototype = Object.create(SuperClass.prototype); 

//create the super member that points to the SuperClass prototype 
SubClass.prototype.super = SuperClass.prototype; 

SubClass.prototype.method2 = function() { 
    alert(this.super.method1.call(this)); 
}; 

var sub = new SubClass('some value'); 

sub.method2(); 

EDIT:

Вот пример чрезвычайно общий super метод, который опирается на нестандартных функций. Я действительно не рекомендую это, и это просто учебное задание.

Object.prototype.super = function() { 
    var superProto = Object.getPrototypeOf(Object.getPrototypeOf(this)), 
     fnName = arguments.callee.caller.name, 
     constructorName = this.constructor.name; 

    if (superProto == null) throw constructorName + " doesn't have a superclass"; 
    if (typeof superProto[fnName] !== 'function') { 
     throw constructorName + "'s superclass (" 
      + superProto.constructor.name + ") doesn't have a " + fnName + ' function'; 
    } 

    return superProto[arguments.callee.caller.name].apply(
     this, 
     [].slice.call(arguments, 1) 
    ); 
}; 


function A() { 
} 

A.prototype.toString = function toString() { 
    //call super method Object.prototype.toString 
    return this.super(); 
}; 

var a = new A(); 

console.log(a.toString()); 
+0

Одна из язвенных язв - «Есть так много способов» :-) Итак, пришло время написать мою собственную функцию подкласса! SO много повторений «Суперкласса» и «Подкласса» и «Прототип» - вообще не выглядит СУХОЙ ... Спасибо в любом случае – virtualnobi

+0

@virtualnobi Вы можете определенно сделать этот DRYer, особенно если вы инкапсулируете процесс наследования внутри функции. Вы всегда можете выдвинуть его в крайности и иметь чрезвычайно общий метод супер, но я бы не рекомендовал этого. – plalx

0

Окей, длинный рассказ короткий: this лучший JavaScript учебник я когда-либо читал. Поэтому я могу дать вам это. Удачи!

+0

Это определенно выглядит стоящим, я не использовал увиденную статью со ссылкой на многие разные языки. Я посмотрю – virtualnobi

+0

Думаю, вам понравится :) Удачи! –

1

У вас нет функции super в JavaScript.

Когда вы знаете суперкласса, вы можете вызвать супер метод непосредственно с помощью call:

Superclass.method1.call(this); 

Если вы хотите эмулировать общий super (который я не сторонник), вы могли бы использовать это:

function sup(obj, name) { 
    var superclass = Object.getPrototypeOf(Object.getPrototypeOf(obj)); 
    return superclass[name].apply(obj, [].slice.call(arguments,2)); 
} 

, что вы будете использовать в качестве

sup(this, 'method1'); 

вместо вашего

super.method1(); 

И если у вас есть аргументы для передачи:

sup(this, 'method1', 'some', 'args'); 

вместо

super.method1('some', 'args'); 

Обратите внимание, что это предполагает надлежащее наследование прототипа, который вы установили с помощью

Subclass.prototype = new Superclass(); 
+0

Ваши вместо неверны, это скорее вместо 'super.method1.call (this);' – plalx

+0

@plalx. Мои «вместо» не являются подходящими javascript, но относятся к вопросу OP. –

+0

Просто он может подумать, что они логически эквивалентны. – plalx

Смежные вопросы