Javascript类防御

Javascript类防御,javascript,inheritance,class,Javascript,Inheritance,Class,当myClass函数返回单个字符串“hii”时,testClass.getDetails()工作正常: function myClass(name, age) { this.name = name; this.age = age; return "hii"; } myClass.prototype.getDetails = function() { return "mydetails"; } var testClass = new myClass('anees

myClass
函数返回单个字符串“hii”时,
testClass.getDetails()
工作正常:

function myClass(name, age) {
    this.name = name;
    this.age = age;

    return "hii";
}
myClass.prototype.getDetails = function() {
    return "mydetails";
}

var testClass = new myClass('aneesh', 27);
alert(testClass.getDetails());
但是当我在
myClass
中返回一个对象时:

function myClass(name, age) {
    this.name = name;
    this.age = age;
    return {};
}
我得到一个错误:

testClass.getDetails不是一个函数


为什么会这样?在Javascript中,字符串也是一个对象,对吗?

不,像您返回的字符串文本(
“hii”
)是一个基本值不是一个对象

在JavaScript中,我们有以下原语:string、number、boolean、undefined和null

如果与
new
运算符一起使用的构造函数返回原语,则将返回

如果返回了一个对象,如第二个示例(IMO并不真正有用),那么新创建的对象(构造函数中的
this
)将丢失,并且您会收到一个错误,因为它不包含名为
getDetails
的属性

例如:

function Test () {
  // don't return anything (equivalent to returning undefined)
}

new Test() instanceof Test; // true

function Test2 () {
  return {};
}

new Test2 instanceof Test2; // false

这是因为构造函数:

  • 如果未指定手动返回,则自动返回新的
    对象
  • 如果手动返回,则返回您选择的另一个对象
但是,不能手动从对象返回基本值,例如原始字符串、数字或布尔值。您可以通过将值包装为字符串对象来解决此问题:

return new String("hii");