javascript - 如何创建行为类似于 native 对象的对象

标签 javascript

我是 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/

相关文章:

javascript - 简单的 require.extensions 示例不起作用

javascript - 根据当前路线突出显示选项卡

javascript - MSIE : Keep focus in text field when clicking outside of it

javascript - 单元测试编译的 JavaScript?

javascript - 如何拆分以逗号分隔的动态创建的字符串并将其放入动态创建的表 td 中的下一行?

javascript - jQuery 无法识别函数

javascript - 将 XML 传递到 Javascript 以在 Google map 中显示标记

javascript - 模型绑定(bind)器未拾取表单编码的 Javascript int []

javascript - 打印时在 Chrome 中隐藏垂直滚动条

javascript - EpicEditor 不可见