六、2、创建对象模式

来源:互联网 发布:手机淘宝怎么打不开了 编辑:程序博客网 时间:2024/06/15 18:18

一、工厂模式
function createPerson(name,age,jpb){
var o=new Object();o.name=name;o.job=job;o.sayName=function(){console.log(this.name);}return o;}var person1=createPerson("Nicholas",29,"Software Engineer");var person2=createPerson("Greg",27,"Doctor");


优点:可以调用函数创建多次对象

缺点:对象识别问题



二、构造函数模式

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");


用函数作为构造函数,然后用new操作符将函数创建为一个对象。


优点:创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型;而这正是构造函数模式胜过工厂模式的地方。

缺点:每次创建新对象时候,sayName函数都会调用Function构造函数创建一个新实例



三、原型模式

function Person(){}Person.prototype.name = "Nicholas";Person.prototype.age = 29;Person.prototype.job = "Software Engineer";Person.prototype.sayName = function(){alert(this.name);};var person1 = new Person();person1.sayName(); //"Nicholas"


将所有的属性和方法都添加到构造函数的原型中。

 prototype 就是通过调用构造函数而创建的那个对象实例的原型对象 //  prototype 是 person1的原型对象


hasOwnProperty() 方法可以检测一个属性是存在于实例中,还是存在于原型中

优点:将所有属性都写到了原型上面,节省了很多不必要开销

缺点:如果其中一个方法函数只想属于其中一个实例就比较麻烦


四、组合使用构造函数模式和原型模式

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); //falsealert(person1.sayName === person2.sayName); //true

将共享属性都放到了原型中,私有属性都保存在了实例属性中


五、动态原型模式

一直不明白高程书上说的意思,不知道动态原型模式有什么意思

参考链接 https://segmentfault.com/q/1010000004546141

像前面混合构造函数模式和原型模式,属性写在构造函数中,共享方法写在原型中,感觉是分开写的,没有全部写在构造函数中。为的是不用每实例化一个对象都在构造函数原型中添加方法。

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的话,你每new一次(即每当一个实例对象生产时),都会重新定义一个新的函数,然后挂到Person.prototype.sayName属性上。而实际上,你只需要定义一次就够了,因为所有实例都会共享此属性的。所以如果去掉if的话,会造成没必要的时间和空间浪费;而加上if后,只在new第一个实例时才会定义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"


这个模式不太理解,上面代码主要是想在函数中为一个数组新增一个方法,这个数组又不能影响原生Array()。

七、稳妥构造函数模式

    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"


让传进去的值,比如name,只能调用  friend.sayName(); //"Nicholas"  ,不用this,也不用new构造函数,这就是稳妥构造函数模式的作用,安全。

原创粉丝点击