在构造函数中创建新实例和在javascript中没有构造函数之间的区别

时间:2015-10-14 09:04:50

标签: javascript

在我的js文件中形成一个对象'myclass',如下所示:

var myclass = function(){
  this.m1 = function(){
    return "THis is m1 of myclass"
  };
  return "this is myclass";
}
myclass.prototype.mp1 = function(){
   return "this is mp1 of myclass"
}

现在我这样做:

var a = new myclass();
var b = new myclass;

Q1-我看不出这两者的行为有什么不同。请解释原因。

Q2 - 当我这样做 - console.log(a)时,我希望在控制台中得到“这是myclass”,而是看到[object object]。

Q3 - 如果我从'myclass'的构造函数返回一个对象(例如 - return {x:1}),那么我就不能再使用'myclass'实例中的'm1'或'mp1'了。

Q4 - 将此与Window对象的Date类进行比较,这是完全不同的行为。如果a = new Date(),那么我将'a'的值视为日期,尽管类型是一个对象,这指向我的下一个问题。

Q5 - 日期类返回一个看起来像DOM中字符串的日期,但日期类实例的“typeof”是一个对象。为什么?

很抱歉一次发布这么多问题,但如果我得到所有问题的答案,我认为它们是相关的,那就太好了。

这个问题不是关于上面的特定问题5.但是所有的组合。因为我必须知道返回类型,myclass()和myclass之间的比较,以及myclass()和Date()/预定义窗口对象之间的比较。

1 个答案:

答案 0 :(得分:0)

首先,我建议你阅读Introduction_to_Object-Oriented_JavaScript 你会找到很多答案。

快速

  

Q1-我看不出这两者的行为有什么不同。请解释原因。

在您的用例中也是如此,因为您的构造函数不需要参数。

  

Q2 - 当我这样做 - console.log(a)时,我希望得到"这是myclass"在控制台中,但我看到[对象对象]。

这是因为您尝试记录Object而不是函数的结果 你应该这样做:console.log( a.m1() );

  

Q3 - 如果我从' myclass'(例如 - return {x:1})的构造函数返回一个对象,那么我就不能使用' m1'或者' mp1'来自“myclass'。

的实例。”
简单地说:你为什么这样做?为构造函数返回除了实例之外的其他内容?

  

Q4 - 将此与Window对象的Date类进行比较,这是完全不同的行为。如果a = new Date(),那么我会看到' a'作为一个日期,虽然类型是一个对象,这指向我的下一个问题。

实际上每个对象都有一个内置函数toString,当你尝试转换/打印"时会调用它。字符串的对象。

修改

来自Ward D.S的评论的
任何东西的默认toString只返回类型。通常是对象。如果您希望更改此行为,只需覆盖您的类的.prototype.toString并返回您想要的内容

致电时:console.log(myDate);
 地下是console.log( myDate.toString() )
 这就是你看日期字符串的原因。

如果您想要添加相同的行为:



var MyClass = function(){
  this.name = 'i am a MyClass';
}
MyClass.prototype.toString= function(){ return this.name };

var a = new MyClass();
document.write (a)




  

Q5 - 日期类返回的日期在DOM中看起来像一个字符串但是' typeof'日期类的实例是一个对象。为什么?

因为javascript中的所有内容都是对象