一、this
this是JavaScript的一个关键字,它在函数运行时在函数内部自动生成的一个对象,只能在函数内部使用;
this,它指的是函数运行环境对象;“谁调用,指向谁”这个说法虽然不准确,但是却很好的解释了实际情况下如何判断函数运行环境。
apply()和bind()可以改变函数的运行环境,如果不传第一个参数,表示函数的运行环境是全局对象
www.ruanyifeng.com/blog/2010/0…
二、constructor
ES5中,想要实现继承,一种方式是通过构造函数封装,然后生成实例,继而实现继承。
当生成实例时,实例对象会自动生成一个constructor,该属性指向当前对象的构造函数;
另外,运算符instanceof 也可以判断对象与构造函数之间关系;
缺点:通过构造函数实现继承可以使得每一个实例都具有构造函数具有的属性和方法,但是,如果我们的实例只需要构造函数中的某几个属性,不需要其他的属性,而实例本身是全都具有的,就会造成资源浪费和多余的内存占用。所以,有没有一种方法,把共享的属性和方法放在一个地方,暴露出一个地址,实例如果需要某个属性,再去地址里面取,这样,共享的属性在内存中始终都只有一份,这种实现继承的方式,我们称之为prototype(原型)继承。
三、prototype
javaScript规定,每一个函数都有一个prototype属性,这个属性指向一个对象,这个对象的所有属性和方法都会被构造函数的实例所继承。
所以我们可以在构造函数的protortype对象上定义那些不变的属性和方法。
相应的,JavaScript为prototype对象设置了三个方法,用来辅助prototype属性:
1)isPrototypeOf 用于检测某个对象的prototype是不是检测对象的原型
Cat.prototype.isPrototypeOf(cat2) // 检测cat2是不是在Cat的原型链上,返回值为布尔值
2)hasOwnProperty 用于检测对象的某个属性是否是自有属性而非继承属性,返回值为布尔值
cat.hasOwnProperty('name')
- in 用于判断实例是否具有某个属性,不管是私有还是继承来的,返回值为布尔值
"name" in cat