我是 JS 的新手,并且对其作为函数式语言和面向对象语言的能力感到非常兴奋。
我想创建一个对象,例如:MyString,其行为类似于 native String() 构造函数。
当我打电话String('name')
时在 Chrome 控制台上,我得到“名称”。
当我调用var s = new String('sname');
时我得到一个对象实例。
同样我也尝试做同样的事情
function MyString(val){
this.toString1 = function(){ return " " + val; }
return val;
}
当我打电话MyString('name')
时,我得到“名字”
当我调用var ms = new MyString('sname');
时我得到一个公开 toString1() 方法的对象(就像 native String() 的 toString() 一样)
我的问题是:
当像这样调用时,MyString 构造函数使用新方法 toString1() 污染了父/全局范围 MyString('name')
。我不希望这种事发生。如何创建像原生对象一样的对象?
最佳答案
你可以很容易地检查你的构造函数是否被 new 调用:
function MyString(val) {
if (this instanceof MyString) { // called with new
this.toString1 = function(){ return " " + val; }
this.name = 'My name is ' + val;
} else { // called without new
return '' + val;
}
}
通常最好在原型(prototype)上设置所有实例通用的方法,但我认为这不是您问题的重点。
MyString.prototype.getMyName = function(){ return this.name; }
关于javascript - 如何创建行为类似于 native 对象的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20544876/