我有一个字符串方法String.prototype.splitName()
,它以名字和姓氏分隔作者的名字(字符串)。语句var name = authorName.splitname();
返回带有name
和name.first = "..."
的对象文字name.last = "..."
(name
的属性具有字符串值)。
最近我被告知将splitName()
作为 public String()类的方法是不明智的,但是我应该创建一个私有 String的子类,并使用我的函数扩展子类(而不是公共类)。我的问题是:如何为字符串执行子类化,以便在将authorName
分配给新的子类name = authorName.splitname();
之后仍然是一个有效的语句?我如何将authorName
分配给String的新私有子类?
答案 0 :(得分:2)
灵感来自https://gist.github.com/NV/282770我回答了自己的问题。在里面 下面的ECMAScript-5代码我定义了一个对象类" StringClone"。通过(1)班级 继承本机类的所有属性" String"。一个例子 " StringClone"是" String"的方法对象。无法应用 没有诡计。应用字符串方法时,JavaScript会调用这些方法 "的toString()"和/或" valueOf()"。通过在(2)中重写这些方法, 类的实例" StringClone"使其表现得像一个字符串。最后, 财产"长度"实例变为只读,这就是为什么(3) 引入的。
// Define class StringClone
function StringClone(s) {
this.value = s || '';
Object.defineProperty(this, 'length', {get:
function () { return this.value.length; }}); //(3)
};
StringClone.prototype = Object.create(String.prototype); //(1)
StringClone.prototype.toString = StringClone.prototype.valueOf
= function(){return this.value}; //(2)
// Example, create instance author:
var author = new StringClone('John Doe');
author.length; // 8
author.toUpperCase(); // JOHN DOE
// Extend class with a trivial method
StringClone.prototype.splitName = function(){
var name = {first: this.substr(0,4), last: this.substr(4) };
return name;
}
author.splitName().first; // John
author.splitName().last; // Doe