6.创建对象
6.1 对象创建方式
6.1.1 工厂模式
Function createPerson(name,age){
Var o = new Object();
o.name = name;
o.age = age;
return o;
}
缺点:没有解决对象识别问题
6.1.2 构造函数模式
Function Person(name.age){
This.name = name;
This.age = age;
This.sayName = function(){
Alert(this.name);
}
}
Var person1 = new Person(“jim”,12);以这种方式调用构造函数会经历一下4个步骤:
1.创建一个对象
2.将构造函数的作用域赋给新对象(此时的this指向这个新对象)
3.执行构造函数中的代码(为这个新对象添加属性)
4.返回新对象
缺点:每个方法都要在每个实例上重新创建一遍
6.1.3 原型模式
Function Person(){
}
Person.prototype.name = “jim”;
Person.prototype.age = 12;
Person.prototype.sayName = function(){
Alert(this.name);
}
Var person1 = new Person();
Person1.sayName();
优点:所有的属性和方法被实例共享
缺点:新对象会具有相同的属性和方法
6.1.3.1原型对象
只要创建一个新函数,该函数就会创建一个prototype属性,这个属性指向函数的原型对象。在默认情况下,所以原型对象都会自动获得一个constructor属性,这个属性指向具有prototype属性的函数。当调用这个构造函数创建一个新实例后,这个实例包含一个指针[[prototype]],执行构造函数的原型对象。
原型.isPrototypeOf(实例);//返回布尔型
Object.getPrototypeOf(实例);//返回原型
每当代码读取某对象的属性时,都会执行一次搜索。搜索首先从对象实例本身开始。如果在实例中找到具有给定名字的属性,则返回该属性的值。如果没有找到,则继续搜索指针指向的原型对象。
虽然可以通过对象实例访问保存在原型中的值,但是不能通过实例重写原型中的值。
实例.hasOwnProperty(属性名); //检测属性是存在原型还是存在实例中,当存在实例中返回true。
6.1.3.2简化后的原型模式
Function Person(){
}
Person.prototype = {
name : “jin”,
age : 45,
sayName : function(){
alert(this.name);
}
}
Var person1 = new Person();
Person1.sayName();
此时对象字面量重写了整个原型对象,那么这个原型的constructor不在指向Person。
6.1.3.3原型的动态性
对原型的修改能够立即从实例上体现出来。但是如果对整个原型做修改,即重写原型,那情况就不一样了。例如,先创建一个实例,在重写整个原型对象,name会出错。
6.1.3.4 原生对象的原型
可以对原生对象的原型,添加方法。
6.1.4 组合使用构造函数模式和原型模式
Function Person(name,age){
This.name = name;
This.age = age;
}
Person.prototype.sayName = function(){
Alert(this.name);
}
6.2 定义对象属性
属性可以动态添加。对象属性分为公有的和私有的。
任何函数里面定义的变量都是私有的,外部不能访问这些变量。Js构造函数就是一个函数,因此可以在里面定义私有属性。
闭包通过自己的作用域链可以访问这些私有变量。
特权方法:有权访问私有变量和私有函数的公有方法。
1)私有属性
私有属性只能在构造函数内部定义与使用。
语法格式:var propertyName=value;
例如:function User(age){
this.age=age;
var isChild=age<12;
this.isLittleChild=isChild;
}
var user=new User(15);
alert(user.isLittleChild);//正确的方式
alert(user.isChild);//报错:对象不支持此属性或方法
2)公有属性
prototype方式,语法格式:functionName.prototype.propertyName=value
this方式,语法格式:this.propertyName=value,注意后面例子中this使用的位置
6.3 定义对象方法
方法可以动态添加。对象函数分为公有的和私有的。
任何函数里面定义的函数都是私有的,外部不能访问这些函数。Js构造函数就是一个函数,因此可以在里面定义私有方法。
闭包通过自己的作用域链可以访问这些私有函数。
1) 私有方法
私有方法必须在构造函数体内定义,而且只能在构造函数体内使用。
语法格式:function methodName(arg1,…,argN){ }
例如:
function User(name){
this.name=name;
function getNameLength(nameStr){
return nameStr.length;
}
this.nameLength=getNameLength(this.name);
}
2) 公有方法
prototype方式,在构造函数外定义,语法格式:
functionName.prototype.methodName=method;
this方式,在构造函数内部定义,语法格式:
this.methodName=method;
例如:
function User(name){
this.name=name;
this.getName=function(){
return this.name;
};
User.prototype.getName= function(newName){
this.name=newName;
};