方法一:
对象字面量
方法二:
Object构造函数
方法三:工厂模式
function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age ;
o.job = job;
ob.sayName = function()
{
alert(this.Name);
}
retuen o ;
}
工厂模式虽然解决了创多个相似对象的问题,但没有解决对象识别的问题。
var person1 = createPerson('nic',29,'ss');
var person2 = createPerson('nic',22,'ss');
构造函数模式---与工厂模式的不同有三点:没有显示的创建对象;没有return 语句;直接将属性与方法赋值给了this对象;构造实例使用new关键字
function Person(name,age,job){
this.name = name;
this.age= age;
this.job=job;
this.sayName = function(){
alert(this.name);
}
}
var person1 = new Person("aa",22,"coder");
var person2 = new Person("b",33,"writer");
这样创建的两个对象实例都有自己的构造函数,创建的对象是Object的实例,也是Person的实例
alert(person1.constructor==Person);//true
alert(person1 instanecof Object);//true
alert(person1 instanecof Person);//true
构造函数和普通函数的区别----只是调用方式不同,任何函数只要通过new操作符来调用,它就可以作为构造函数
构造函数三种调用方式
一
//当作构造函数调用
var person = new Person("nic",29,"software enginner");
person.sayName();
二
//当作普通函数调用
Person("Gerg",27"doctor");
window.sayName();
三
//在另一个对象的作用域中调用
var o = new Object();
Person.call(o,"kine”,25,"nurse");
o.sayName();
构造函数的问题:每个方法都要在每个实例上重新创建一遍即(person1.sayName == person2.sayName);//false
原型模式
我们创建 的每个函数都有一个原型属性,这个属性是一个指针,指向一个对象。
function Person(){}
Person.prototype.name = "Nicholas";
Perosn.protptype.age = 29;
Person.prototype.job = "soft engineer";
Person.prototype.sayName = function(){
alert(this.name)
}
var person1 = new Person();
person1.sayName();
var person2 = new Person();
alert(person1.sayName == person2.sayName);//true
每次访问对象属性的原理:首先搜索对象实例本身,如果没找到再搜索原型对象中有没有改名字的属性
实例的属性是在自己实例中获取或者在原型中获取
person1.hasOwnProperty("name")//只有存在实例中才返回true
person1.hsaPrototypeProperty()//如果存在实例中就返回false
alert("name" in person1);//来自原型或者实例都返回true
原型属性遍历
var key = Object.keys(Person.prototype);
更简单的原型语法
function Perosn(){}
Person.protptype={
name :"nick",
age :29
job :"softwarw engineer",
sayName:function(){
}
};
var friend = new person();
alert(friend instanceof Object);//true
alert(friend instanceof Object);//true
alert(friend.constructor == Person);//false
alert(friend.constructor == Object);//true
对原型所做的修改都可以反映在实例中,都是先在实例中搜索sayHi属性,没有找到的情况下,会继续搜索原型
var friend = new Person();
Person.prototype.sayHi = function(){
alert("hi");
}
friend.sayHi();//“hi”
实例中的指针仅仅指向原型,而不指向构造函数
function Person(){}
var friend = new Person();
Person.prototype = {
constructor:Person,
name:"nick",
age :29,
job:"software engineer",
sayName:function(){
alert(this.name);
}
}
原型模式的问题缺陷:所有的实例在默认情况下都取得相同的属性值;一个实例修改;了原型值,其他实例受到影响