在JavaScript的世界里没有类的概念,JavaScript是一种基于对象的语言,它包含5中原生数据类型:
number
boolean
string
null
undefined
除此之外,其他所有的都是对象,函数也是一个对象
// 这是一个函数声明,函数是一个特殊的对象function method() {
}
构造函数,就是一个普通的函数,与其他函数没有任何区别,可以理解为 函数==构造函数,它只是概念上的一个定义,使用它用来实例化对象。
对于JavaScript的内置对象,Object、Array、Date等等这些都是构造函数。
function Obj() {}
var o = new Obj() // 实例化
使用new运算符返回的对象并不一定是实例本身,也可以在构造函数用使用return改变返回值
function Obj() {this.a = 1
return { a: 2 }
}
var o = new Obj() // o并不是Obj的实例
console.log(o.a) // 输出2
前面说到了函数也是一个对象,在JavaScript的内置对象中,所有的函数对象都是Function构造函数的实例,比如:Object、Array等等,这是一个很有意思的事情。
使用 instanceof 这个运算符就可以校验
instanceof运算符返回一个指定的对象是否一个类的实例,格式如:A instanceof B。其中,左操作数必须是一个对象,右操作数必须是一个类(构造函数)。
判断过程:如果函数B在对象A的原型链中被发现,那么instanceof操作符将返回true,否则返回false。
alert(Function instanceof Function) // Function函数对象 本身就是自己的一个实例alert(Object instanceof Function) // Object函数对象 是 Function构造函数的一个实例
上面说道 instanceof 的现象是一件很有意思的事情,如果想了解更多,需要阅读 JavaScript原型链继承 相关的文章加深理解。
var person1=createPerson("Nicholas",29,"software Engineer")var person1=new Person("Nicholas",29,"software Engineer")
区别在这两句话中,你可以看到第一个语句里面没有new关键字,直接执行一个函数;而第二个表达式中有new,也就是说是新实例化了一个对象。
JS中关于this的定义是:函数直接在全局中执行,那么this指向的是全局对象window。也就是说你在createPerson中new了一个o,但是你再执行this.name=name那么就等于是执行了window.name=name,o对象本身不会有任何印象,最后你return了o也只是得到了一个空对象。
而JS中执行了new之后,等于通过构造函数创建了一个新对象,那么这个构造函数中的this也就指向了这个新实例化的对象,此时this.name=name修改了新对象person1中的name值。
关于对象实例化的知识和this指向的问题题主还多翻一翻博客园的文章,讲的很详细,从长久发展来看先打好基础对你以后的道路更有好处。