1、JavaScript对象定义:无序属性的集合,其属性可以包含基本值、对象或者函数。严格来说,这就相当于对象是一组没有特定顺序的值。对象的每个属性和方法都有一个名字,而每个名字都映射到一个值。
2、构造函数创建新实例步骤:(1)创建一个新对象(2)将构造函数的作用域赋给新对象(3)执行构造函数中的代码(4)返回新对象
3、构造函数和其他函数区别在于调用的方式不同。任何函数,只要通过new操作符来调用,那它就可以用作构造函数,任何函数如果不通过new来调用,那它跟普通函数没有什么区别。
4、构造函数缺陷:使用构造函数的主要问题,就是每个方法都要在每个实例上重写创建一遍。
例如:
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayname=functon(){
alert(this.name);
}
}
var person1=new Person("Mike","28","doctor")
var person2 = new Person("Jack","26","farmer");
alert(person1.sayname == person2.sayname) ; // false 说明两个对象
共同使用一个函数,不必在执行对象前,把对象绑定到函数上。可以通过把函数定义转义到构造函数外部来解决这个问题。
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=sayName;
}
function sayName(){
alert(this.name);
}
var person1=new Person("Mike","28","doctor")
var person2 = new Person("Jack","26","farmer");
alert(person1.sayName==person2.sayName); //true
把sayName()函数定义转移到了构造函数外部。而在构造函数内部,我们将sayName属性设置成等于全局的sayName()函数。
由于sayName包含一个指向函数的指针,因此person1和person2对象就共享了在全局作用域中定义的一个sayName()函数。
5、原型模式
用途是包含可以由特定类型的所有实例共享的属性和方法,好处是可以让所有对象实例共享它所包含的属性和方法。
不必在构造函数中定义对象信息,而是可以将这些信息直接添加到原型对象中。
function Person(){
}
Person.prototype.name="Mike";
Person.prototype.age="28";
Person.prototype.job="farmer";
Person.prototype.sayName=function(){
alert(this.name);
}
var person1=new Person();
person1.sayName(); //Mike
var person2 =new Person();
person2.sayName(); //Mike
alert(person1.sayName==person2.sayName) ; //true
将sayName()方法和所有属性直接添加到Person的prototype属性中,构造函数成了空函数。仍然可以通过构造函数来创建一个新对象,
而且新对象还会具有相同的属性和方法。但是与构造函数不同,新对象这些属性和方法是由所有实例共享的。person1和person2访问的是同一组属性和函数。
6、组合使用构造函数和原型模式
创建自定义类型的最常见方式,就是组合使用构造函数与原型模式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性
这样,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用。节约内存。
function Person(age,name.job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["Pony","Jack"];
}
Person.protoype{
constructor:person,
sayName:function(){
alert(this.name);
}
}
var person1=new Person("Zhang","28","engineer");
var person2=new Person("Li","27","farmer");
person1.friends.push("Van");
alert(person1.friends); // pony , jack ,Van
alert(person2.friends); // pony,jack
alert(person1.friends===person2.friends); //false
alert(person1.sayName===person2.sayName); //true
7、动态原型模式
动态原型把所有信息都封装在构造函数中,而通过构造函数中初始化原型,又保存了同时使用构造函数和原型的优点。
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
if(typeof this.sayName!="function"){
Person.prototype.sayName=function(){
alert(this.name);
};
}
}
if语句块只有在初次调用函数的时候才会执行,此后原型已经完成了初始化,不需要在做什么修改了。
if语句检查可以是初始化之后应该存在的任何属性或方法。
8、稳妥构造函数模式
指的是没有公告属性,而且其方法也不引用this的对象。
(1)新创建的实例方法不引用this(2)二是不使用new操作符调用构造函数
function Person(name,age,job){
var o=new Object(); //创建返回对象
//添加方法
o.sayName =function(){
alert(name);
};
return o;
}
变量person保存 的是一个稳妥对象,而除了sayName()方法外,没有别的方式可以访问其数据成员。