/ / Subclassing objetos nativos - javascript, oop, subclass

Subclassificando objetos nativos - javascript, oop, subclass

Eu quero criar minha própria subclasse RegExp, com métodos adicionais. Esta é a versão mais simplificada da minha abordagem:

// Declare the subclass
function subRegExp(){}

// Inherit from the parent class
subRegExp.prototype = new RegExp();

// Create a new instance
regex = new subRegExp("[a-z]", "g");

Mas não consigo criar uma nova instância.

este diz-me que o ECMAScript não suporta subclassificação de objetos nativos, mas faz cinco anos, então espero que haja algumas opções agora.

Como posso conseguir isso?

Edição: Está tudo bem ou vou ter alguns problemas?

function subRegExp(str, flags){

var instance = new RegExp(str, flags);

// Custom method
instance.setFlags = function(flags){
return new subRegExp(this.source, flags);
}

return instance;
}

regex = new subRegExp("[a-z]", "g");

Respostas:

2 para resposta № 1

Os invólucros são seus amigos e uma solução comum para fornecer funcionalidade estendida sem usar herança.

var MyRegexClass = function(regExpInstance) {
this.originalRegex = regExpInstance;
};

// Replicate some of the native RegExp methods in your wrapper if you need them.
MyRegexClass.prototype.test = function(str) {
return this.originalRegex.test(str);
};

MyRegexClass.prototype.exec = function (str) {
return this.originalRegex.exec(str);
};

// Now add in your own methods.
MyRegexClass.prototype.myCustomFunction0 = function () {
// this method does something with this.originalRegex
};
MyRegexClass.prototype.myCustomFunction1 = function () {
// this method also does something with this.originalRegex
};

// Example usage
var matchDavids = new MyRegexClass(/David/);

// this call works, because my class provides the .test() method.
var hasMatch = matchDavids.test("David walked his dog to the park.");

// this call does not work, because my class does not expose the .compile() method.
matchDavids.compile();
// I would need to provide a .compile() method on MyRegexClass that calls to
// the originalRegex.compile().

Sim, você perde a cadeia de herança. MyRegexClass não herda do RegExp nativo. Na minha experiência, os wrappers são mais fáceis de testar e manter do que as extensões baseadas em herança.


1 para resposta № 2

No entanto, você pode simular algumas dasfuncionalidade requerida usando uma classe de objeto do wrapper customizado. Use o encapsulamento no construtor para atribuir a ele um objeto RegExp como (o mais próximo que o Javascript precisa) de um campo privado.


1 para resposta № 3

Eu tentei isso:

// Declare the subclass
function subRegExp(){}
// make your object inherit from regex object
subRegExp.prototype = Object.create( RegExp.prototype );

var x = new subRegExp();
// see if your custom object inherited the RegExp properties/functions/methods
console.dir( "compile" in x );
console.dir( x.compile );

Saída:

true
function compile() { [native code] }

0 para a resposta № 4

Sim, agora é possível no ES6:

class R extends RegExp {}
var r = new R("baz", "g");
return r.exec("foobarbaz")[0] === "baz" && r.lastIndex === 9;

Temos um teste para isso na tabela de compatibilidade ES6, onde você pode ver quais implementações o suportam.

Vou tentar atualizar minha postagem no blog (que você mencionou) sobre Subclasse de matriz no ES5 em breve.