javascrip 构造函数说明



一、示例说明
 /*
         普通函数与构造函数本质上没有任何区别,只是我们调用的方式不同而已,关键在于一个字 new。
调用构造函数:newfunction_name();
调用普通函数:function_name();
在函数中有一个this对象,this始终代表该函数的调用者。
如果是构造函数,this就是构造出来的新对象。
如果是普通函数,this就是 window 对象。
如果使用new关键字调用,那么函数的 return 语句不再起作用,因为这时还回的是 this 对象
        */
        var Book = function (name, price) {
            this.name = name;
            this.price = price;
            if (this == window) {
                return "name = " + name;
            } else {
                alert("this book price is " + this.price);
            }
        }
         var result = Book("java", 100);//this 指向window
            alert(result);
            var book = new Book("c#", 120);
二、动态添加属性
    //动态添加属性
function Foo(){
        this.name="Foo";
    }
    var obj = new Foo();
    obj.name = "Foo1";
    alert("name:"+obj.name);
三、简单对象创建方式比较:
1.简单方式
var person = new Object();
person.name = “LL”;
person.age = 22;
问题:创建多个相似对象,大量重复代码
2、 工厂模式
function Person (name,age){
           var o = new Object();
           o.name = name;
           o.age = age;
           o.getName=function(){
                    alert(this.name);
    }
           return o;
}
var person1 = new Person(“LL”,22);
person1.getName() ;         //”LL”

    (1)根据接受的参数来构建一个包含所有必要信息的Person对象,多次调用,每次返回一个包含两个属性和一个方法的对象。
    (2)优点:解决了创建多个相似对象的问题
    问题:对象识别的问题,即怎样知道一个对象的类型

    解决:构造函数

3、原型模式

   function Person(){

     }

     Person.prototype.age = 20;

    Person.prototype.name = "xiao wang";

   Person.prototype.hobby = new Array("sport","swiming");

var p1 = new Perosn();

var p2 = new Person();

p1.hobby.push("football");

  alert(p1.hobby);  //output: sport,swimming,football
  alert(p2.hobby);  //output  sport,swimming,football

原型方式有个很严重的问题就是当属性指向的是对象时,如数组,这里由于数组的引用值,Person的两个对象指向的都是同一个数组,所以当在p1添加值后,在p2中也可以看到。
 联合是用构造函数/原型方式就可以像其他程序设计语言一样创建对象,是用构造函数定义对象的非函数属性,用原型方式定义对象的方法,使用


function Person (){

      this.hobby = new Array("sport","swiming");

}

Property.prototype.showName = fucntion(){

alert(this.name);

}

Person.prototype.name = "xiao wang";

var p1 = new Perosn();

var p2 = new Person();

p1.hobby.push("football");

  alert(p1.hobby);   // output: sport,swimming,football
  alert(p2.hobby);   // output  sport,swimming

4、 构造函数模式

    function Person(name,age){
               this.name = name;
               this.age = age;
               this.getName = function(){
                 alert(this.name);
        };
    }
    var person1 = new Person(“LL”,22);

    1)与工厂模式比较

    a.没有显示的创建对象;

    b.直接将属性和方法赋值给this对象;

    c.没有return语句;

    d.将实例标识为一种特定的类型(instanceof);

    (2)构造函数与普通函数区别

    a.习惯:构造函数始终一个大写字母开头,非构造函数以一个小写字母开头

    b.唯一区别:调用方式不同,用new调用为构造函数,不用new为普通函数
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值