如何创建行为与本机对象相似的对象

时间:2013-12-12 13:28:43

标签: javascript

我是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这样的对象?

3 个答案:

答案 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; }