JS是面向对象的语言,函数也是对象。下面大致介绍下实例,原型与构造函数之间的关系。
构造函数模式
function Person(name,age){
this.name = name;
this.age = age;
this.sayname = function(){
alert(this.name);
}
}
定义构造函数,函数名字首字母大写,并使用new操作符实例化构造函数。构造函数本身也是函数,只不过可以用来创建对象。构造函数的特点是:
1.没有显式的创建对象
2.将属性和方法赋给力this对象
3.没有return语句
实现步骤为:
1.创建一个新对象
2.将构造函数的作用域赋给新对象(this指向这个新对象)
3.执行构造函数的代码,给构造函数添加属性和方法
4.返回新对象
构造函数的主要问题是,每个方法都要在每个实例上创建一遍。
原型模式
每个函数都有一个prototype属性,这是一个指向其原型对象的指针。原型对象的好处就是可以让对象实例共享其原型对象中的属性和方法。
原型对象中的constructor属性指向其构造函数。构造函数的prototype指向其原型对象。如果使用对象字面量重写构造函数时,记得指定constructor属性,否则constructor会指向object.
实例
new构造函数就可以创建该构造函数的实例,实例对象中的__proto__指向其构造函数对应的原型对象。
构造函数的prototype指向其原型对象,原型对象的constructor指向其构造函数,使用new关键字实例化构造函数,实例化对象的__proto__指向其原始的原型对象。
创建自定义对象的有效方式就是组合使用构造函数模式和原型模式。构造函数模式定义实例属性,原型模式定义方法和公用的属性。这样每个实例都有自己自定义的属性,同时又共享着对方法的引用,最大成本的节省内存。
相关操作符
delete操作符:删除实例中的指定属性。从而可以访问原型中同名的属性。
hasOwnProperty()方法:检测一个属性是存在于该对象的实例中,属于实例属性时,才返回true,否则属于原型属性,则返回false。
in操作符:
单独使用时,如果该对象中存在这个属性,则返回true,不管这个属性是实例属性还是原型属性。name in object
使用for-in循环时,返回的是该对象可枚举的所有属性。
每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针(constructor),而实例都包含一个指向原型对象的内部指针(__pro__)。