例子:数组
function createPerson(name,age){ var o = new Object(); o.name = name; o.age = age; o.sayName = function () { alert(this.name); } return o; } var person1 = createPerson("EvanChen",18,"Software Engineer");//建立一个对象
问题:没有解决对象识别问题安全
alert(person1 instanceof createPerson)//fasle 会发现其实并不存在一个createPerson类
例子:app
function Person(name,age){ this.name = name; this.age = age; this.sayName = function(){ alert(this.name); } } var p1 = new Person('EvanChen',18);//建立一个Person类
用new操做符调用构造函数经历了如下4个步骤:函数
(1)建立一个新对象this
(2)将构造函数的做用域赋给新对象prototype
(3)执行构造函数中的代码code
(4)返回新对象对象
解决了工厂模式兑现识别问题:ip
alert(typeof(p1));// Person alert(p1 instanceof(Person));// true
例子:ci
function Person(){ } Person.prototype.name = "EvanChen"; Person.prototype.age= 18; Person.prototype.sayName= function(){ alert(this.name); } var p1 = new Person(); p1.sayName(); //"EvanChen" var p2 = new Person(); p2.sayName(); //"EvanChen" alert(p1.sayName == p2.sayName); //true
将全部属性和方法都加在Person的prototype属性中,所以新对象具备相同的属性和方法。
例子:
function Person(name,age){ this.name = name; this.age = age; this.friends = ["Shelby","Court"]; }; Person.prototype = { constructor:Person, sayName:function(){ alert(this,name); } } //Person.prototype.sayName = function(){ // return this.name; //}; var person1 = new Person("EvanChen",18); var person2 = new Person("Greg",16); person1.friends.push("Van"); alert(person1.friends);//"Shelby,Court,Van" alert(person2.friends);//"Shelby,Court" alert(person1.friends == person2.friends);//false alert(person1.sayName == person2.sayName );//true
全部实例共享原型中的属性constructor和方法sayName(),相同的属性在构造函数中定义。
例子:
function Person(name,age){ this.name = name; this.age = age; if (typeof this.sayName != "function"){ Person.prototype.sayName = function(){ alert(this.name); }; } }; var person1 = new Person("EvanChen",18); person1.sayName();
在sayName()方法不存在的状况下,才会将它添加到原型中,当原型完成初始化后,可以当即在全部实例中获得共享。
基本思想是:建立一个函数,该函数的做用仅仅是封装对象的代码,而后再返回新构建函数的对象
例子:
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());//red|blue|green
构造函数返回的对象与构造函数外部建立的对象没有什么不一样,所以不能依赖instanceof操做符来肯定对象类型。
稳妥对象指的是没有公共属性,并且其方法也再也不引用this的对象。稳妥对象最适合在一些安全的环境中,或者防止数据被其余应用程序删改时使用。
例子:
function Person(name, age) { //建立要返回的对象 var o = new Object(); //定义私有变量和函数 o.sayName = function (){ alert(name); } return o; } var person1 = Person("EvanChen", 18); person1.sayName();//"EvanChen"
在这种模式建立的对象中,除了使用sayName()方法外,没有其余方法访问name的值。