原型(prototype)
- 创建一个函数(所有函数)以后,解析器都会默认在函数中添加一个属性prototype
prototype属性指向的是一个对象,这个对象我们称为原型对象。
创建一个函数MyClass()。
function MyClass(){}
- 当该函数作为构造函数使用,它所创建的对象中都会有一个隐含的属性指向该原型对象。
这个隐含的属性可以通过对象.__proto__来访问。如果这个函数是个普通函数,那么prototype属性也没什么作用。
调用构造函数,创建一个对象。
var mc=new MyClass();
作为构造函数调用的函数MyClass函数中的prototype属性和这个构造函数创建的对象的__proto__属性是指向同一个对象(原型对象的)(指向的内存地址一样)
每一个由该构造函数创建的对象都有这么__proto__一个属性,指向同一个原型对象。
- 原型对象就相当于一个公共的区域,凡是通过同一个构造函数创建的对象他们通常都可以访问到相同的原型对象。
我们可以将对象*有的属性和方法统一添加到原型对象中,
向原型对象里添加一个属性
MyClass.prototype.a=123;
这样我们只需要添加一次,就可以使所有的对象都可以使用。
hasOwnProperty()
- 博客14中的方法对象中没有而这个对象的原型对象有也会返回true。
- 这个方法可以用来检查对象自身中是否含有某个属性、方法
- 语法:对象.hasOwnProperty("属性名")
这个hasOwnProperty()方法用着是挺方便的,但是mc对象里边好像没有这个方法啊。
会在mc的原型对象中吗?也是没有!
- 当我们去访问对象的一个属性或调用对象的一个方法时,它会先自身中寻找,
如果在自身中找到了,则直接使用,如果没有找到,则去原型对象中寻找。
如果没有找到,则去原型的原型(原型对象也是对象,也会有原型对象)中寻找,依此类推。
直到找到Object的原型为止,Object的原型的原型为null(Objiect对象的__proto__属性的值为null),如果依然没有找到则返回undefined。