标识符指变量,函数,属性的名字,或者函数的参数;
对象是引用类型的值,是引用类型的一个实例;引用类型是一种数据结构;
所有引用类型默认都继承自Object类型,所有对象都继承自Object(JS高程);
创建对象的方式
1.工厂模式
原理:在普通函数中创建一个对象,通过函数传参至对象内,返回对象;调用函数即可返回一个对象;
缺点:没有对象识别,及没有对象类型;
例子:
//1.工厂模式
function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson("Nicholas",29,"Software Engineer");
var person2 = createPerson("Greg",27,"Doctor");
2.构造函数模式
原理:
使用new操作符调用构造函数;
将构造函数的作用域赋给新对象(this指向新对象);
构造函数内部通过参数和this为新对象添加属性;
返回新对象;
缺点:每个实例对象的方法不是同一个Function实例;若将方法定义为全局函数又无任何封装性可言;
例子:
//2.构造函数模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
var person1 = new Person("Nicholas",29,"Software Engineer");
var person2 = new Person("Greg",27,"Doctor");
}
3.原型模式
原理:
定义构造函数
通过函数的prototype指针修改原型对象中的属性和方法
缺点:所有属性在原型对象中修改,导致所有属性被所有实例共享;
//3.原型模式
function Person(){
}
Person.prototype = {
name:"Nicholas",
age:29,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
};
var person1 = new Person;
var person2 = new Person;
person1.sayName();//"Nicholas"
person2.sayName();//"Nicholas"
alert(person1.sayName == person2.sayName)//true
4.组合使用构造函数模式和原型模式
原理:
实例属性在构造函数中定义
共享属性和方法在原型中定义
//组合使用构造函数模式和原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Shelby","Court"];
}
Person.prototype = {
constructor : Person,
sayName : function(){
alert(this.name);
}
}
var person1 = new Person("Nicholas",29,"Software Engineer");
var person2 = new Person("Greg",27,"Doctor");
person1.friends.push("Van");
alert(person1.friends);//"Shelby,Count,Van"
alert(person2.friends);//"Shelby,Count"
alert(person1.friends === person2.friends);//false
alert(person1.sayname === person2.sayname);//true
5.动态原型模式
暂时不理解
6.寄生构造函数模式
原理:
同工厂模式的函数相同;
调用时使用new通过构造函数创建对象;
由于在构造函数中返回了一个对象,因此构造函数本身不需要再返回实例;即重写了调用构造函数时返回的值;
因此,构造函数返回的对象与构造函数原型没有关系;
优点:
给已有的对象添加方法并返回,为新对象创建构造函数,比如创建一个具有额外方法的数组;
缺点:
返回的对象与构造函数原型没有任何关系,因为在构造函数中返回了对象重写调用构造函数时本应该返回的值;
例子:
function SpecialArray(){
//创建数组
var values = new Array();
//添加值
values.push.apply(values,arguments);
//添加方法
values.toPipedString = function(){
return this.join("|");
};
//返回数组
return values;
}
var colors = new SpecialArray("red","blue","green");
alert(colors.toPipedString());
7.稳妥构造函数模式
原理:
在函数中创建一个对象;
在函数中定义一个方法访问其中的属性;
返回对象;
调用时不使用new,通过普通函数返回对象;
优点:除在函数中定义的方法外,没有其他方法可以访问属性,安全;
例子:
function Person(name,age,job){
var o = new Object();
o.sayName = function(){
alert(name);
}
return o;
}
var friend = Person("Nicholas",29,"Software Engineer");
friend.sayName();//"Nicholas"
继承
1.原型链
2.借用构造函数
3.组合继承
4.原型式继承
5.寄生式继承
6.寄生组合式继承
普遍式方式,需要时再整理,未完。
–整理自《Javasctipt高级程序设计》