我是JS的新手,对于它兼具功能和功能的能力感到十分兴奋。 OO语言。
我想创建一个对象Eg:MyString,其行为类似于本机String()构造函数。
当我在Chrome控制台上调用String('name')
时,我会得到'姓名'。
当我调用var s = new String('sname');
时,我得到一个对象实例。
同样,我尝试做同样的事情
function MyString(val){
this.toString1 = function(){ return " " + val; }
return val;
}
当我致电MyString('name')
时,我得到'姓名'
当我调用var ms = new MyString('sname');
时,我得到一个暴露toString1()方法的对象(就像本机String()的toString())
我的问题是:
MyString构造函数在调用此MyString('name')
时,使用新方法toString1()污染父/全局范围。我不希望这种情况发生。如何创建像native这样的对象?
答案 0 :(得分:2)
您可以非常轻松地检查是否使用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;
}
}
通常最好为原型上的所有实例设置常用方法,但我认为这不是你问题的重点。
MyString.prototype.getMyName = function(){ return this.name; }
答案 1 :(得分:0)
看起来你应该使用prototype:
function MyString(val){
this.val = val;
}
MyString.prototype.toString1 = function(){ return " " + this.val }
var s = new MyString("thing");
console.log(s.toString1()); // logs " thing"
toString1
未附加到外部范围。它可以在MyString
的所有实例上自动访问。它附加到原型而不是对象的事实避免了函数的重复,使其更有效。
如果您想要的是避免MyString
构造函数在没有new
运算符的情况下不正确地调用时污染外部作用域,那么答案虽然很容易,但不要:不要防止公然不正当地使用您的API,因为它会使您的代码变得复杂而没有收益。无论如何,这是一场失败的战斗,糟糕的程序员总会找到一种方法来使用你的代码失败。使用new SomeClass(args)
是基本的JavaScript编程。
答案 2 :(得分:0)
试试这个:
MyString = function(name){ this.name = name; }
MyString.prototype.toString = function(){ return " " + this.name; }