检测对象类型:instanceof
hasOwnProperty 实例对象.hasOwnProperty("属性名") //用于检测访问的是实例属性(返回true)还是原型属性(返回false);
in "属性名" in 实例对象 //不管属性是实例对象还是原型里的都会返回ture;
注:同时使用 hasOwnProperty()方法和 in 操作符,就可以确定该属性到底是存在于对象中,还是存在于原型中;
对象创建方法:
1. object构造函数
var person = new Object();
person.name = "张三";
person.age = 18;
person.say = function(){alert("Hello World!")};
2.对象字面量
var person = {
name : "张三",
age : 18,
say : function(){alert("Hello World!")}
}
3.工厂模式 //函数名首字母小写,要return出去 //这个方法的好处是避免了多个类似的对象重复创建,缺点没有解决对象的识别问题(即怎样知道一个对象的类型),由此引出了构造函数
function creatPerson(name,age){
var o = new Object();
o.name = name;
o.age = age;
o.say = function(){ alert(o.name)};
return o;
}
var person1 =creatPerson("张三",18);
var person2 =creatPerson("李四",18);
4.构造函数 //与工厂模式不同之处:a.没有显示的创建对象;b.直接将属性和方法指向了this对象; c.没有return; d.函数名首字母大写 //缺点每一个方法都要在每个实例上创建一次,由此引出了原型模式
function CreatPerson(name,age){
this.name = name;
this.age = age;
this.say = function(){ alert( this.name)};
}
var person1 =new CreatPerson("张三",18);
var person2 =new CreatPerson("李四",18);
alert(person1.say == person2.say); //false
构造函数经过以下步骤:
1.创建一个新对象; 2.将构造函数的作用域赋值给新对象(即this指向新对象) ; 3.执行构造函数的代码(为新对象添加属性和方法) ; 4.返回新对象;
5.原型模式
functio Person(){};
Person.prototype.name = "张三";
Person.prototype.age = 18;
Person.prototype.say = function(){ alert(this.name)};
var person1 = new Person();
var person2 = new Person();
alert(person1.say() == person2.say()) //true
原型模式的简化版
functio Person(){};
Person.prototype ={
constructor:Person, //
name:"张三",
age:18,
say:function(){ alert(this.name)}
}
6.构造函数与原型组合模式
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype={
constructor : Person,
say : function(){ alert(this.name) };
}
var person1 = new Person("张三",18);
var person2 = new Person("李四",20);
7.寄生构造函数(与工厂模式差不多,个人觉得区别在于函数名首字母的大小写)
function Person(name,age){
var o = new Object();
o.name = name;
o.age = age;
o.say = function(){alert(o.name)};
return o;
}
var person1 = new Person("张三",15);
person.say(); //张三
8.稳妥构造函数