zoukankan      html  css  js  c++  java
  • javascript对象的几种创建方式

    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('lucy',26,'singer');
    var person2 = createPerson('Alien',20,'dance');

    在使用工厂模式创建对象的时候,我们都可以注意到,在createPerson函数中,返回的是一个对象。


    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('lucy',26,'singer');
    var person2 = new Person('Alien',20,'dance');
    console.log(person1);

    对比工厂模式,我们可以发现以下区别:

    1.没有显示地创建对象

    2.直接将属性和方法赋给了this对象

    3.没有return语句

    4.终于可以识别的对象的类型。对于检测对象类型,我们应该使用instanceof操作符,我们来进行自主检测:

    alert(person1 instanceof Object);//ture
    alert(person1 instanceof Person);//ture
    alert(person2 instanceof Object);//ture
    alert(person2 instanceof Object);//ture

    同时我们也应该明白,按照惯例,构造函数始终要应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。

    那么构造函数确实挺好用的,但是它也有它的缺点:

    就是每个方法都要在每个实例上重新创建一遍,方法指的就是我们在对象里面定义的函数。如果方法的数量很多,就会占用很多不必要的内存。

    3.原型模式

    function Person(){}
    Person.prototype.name = 'lucy';
    Person.prototype.age = 26;
    Person.prototype.jbo = 'singer';
    Person.prototype.sayName = function(){
    alert(this.name);
    };
    var person1 = new Person();

    使用原型创建对象的方式,可以让所有对象实例共享它所包含的属性和方法

    如果是使用原型创建对象模式,请看下面代码:

    function Person(){}
    Person.prototype.name = 'lucy';
    Person.prototype.age = 26;
    Person.prototype.jbo = 'singer';
    Person.prototype.sayName = function(){
    alert(this.name);
    };
    var person1 = new Person();
    var person2 = new Person();
    person1.name ='Alien';
    alert(person1.name);

    4.混合构造函数和原型模式

    function Person(name,age,job){
    this.name =name;
    this.age = age;
    this.job = job;
    }
    Person.prototype = {
    constructor:Person,
    sayName: function(){
    alert(this.name);
    }
    }
    var person1 = new Person('lucy',26,'singer');
    console.log(person1);

    5.动态原型模式

    function Car(name,price){
    this.name=name;
    this.price=price;
    if(typeof Car.sell=="undefined"){
    Car.prototype.sell=function(){
    alert("我是"+this.name+",我现在买"+this.price+"万元");
    }
    Car.sell=true;
    }
    }
    var camry =new Car("凯美瑞",27);
    console.log(camry.sell());


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

    6.寄生构造函数模式

    function SpecialArray(){
    var array = new Array();
    array.push.apply(array,arguments);
    array.toPipedString = function(){
    return this.join("|");
    };
    return array;
    }
    var colors = new SpecialArray("red","green","pink");
    alert(colors.toPipedString());// red|green|pink
    alert(colors instanceof SpecialArray); // false

    7.稳妥构造函数模式


    function Person(name,age,gender){
    var obj = new Object();
    obj.sayName = function(){
    alert(name);
    };
    return obj;
    }
    var person = Person("Stan",0000,"male"); // 这里没有使用new操作符
    person.sayName(); // Stan
    alert(person instanceof Person); // false

  • 相关阅读:
    C# Xamarin For Android自动升级项目实战
    C# Xamarin移动开发基础进修篇
    .NET轻量级ORM框架Dapper入门精通
    ASP.NET WebApi技术从入门到实战演练
    (简单、可靠的安装方法)在Windows Server2016中安装SQL Server2016
    ASP.NET (Core) WebAPI IIS PUT和DELETE请求失败 405的解决办法
    js中判断对象是否为空的三种实现方法
    windows10如何设置只显示时间不显示日期
    NuGet微软官方中国国内镜像
    Win10找不到hosts文件解决方法
  • 原文地址:https://www.cnblogs.com/lulublog/p/8526007.html
Copyright © 2011-2022 走看看