Javascript学习心得(二)

时间:2021-12-08 14:05:36
继续昨天的学习,感觉leadzen的《悟透Javascript》一文讲解更为生动和形象,非常有助于理解复杂概念。

1.共享属性和方法。上文说过,使用new function()方式创建的对象都会保存自己一份function()中定义的属性和方法副本。在另一方面,JS中使用prototype来实现所有对象共享的属性和方法。 JavaScript的所有function类型的对象都有一个prototype属性。这个prototype属性本身又是一个 object类型的对象,因此我们也可以给这个prototype对象添加任意的属性和方法。在构造函数的prototype上定义的所有属性和方法,都是可以通过其构造的对象直接访问和调用的。也可以这么说,prototype提供了一群同类对象 共享属性和方法的机制。

    function Person(name){
        this.name = name;   //设置对象属性,每个对象各自一份属性数据
    };    
    Person.prototype.SayHello = function(){  //给Person函数的prototype添加SayHello方法。
        alert("Hello, I'm " + this.name);
    } 
    var BillGates = new Person("Bill Gates");   //创建BillGates对象
    var SteveJobs = new Person("Steve Jobs");   //创建SteveJobs对象
    BillGates.SayHello();   //通过BillGates对象直接调用到SayHello方法,显示I am Bill Gates
    SteveJobs.SayHello();   //通过SteveJobs对象直接调用到SayHello方法,显示 I am Steve Jobs
    alert(BillGates.SayHello == SteveJobs.SayHello); //因为两个对象是共享prototype的SayHello,所以显示:true

2.Ptototype链。在JavaScript内部,对象的属性和方法追溯机制是通过所谓的prototype链来实现的。当用new操作符构造对象时,也会同时将构造函数的prototype对象指派给新创建的对象,成为该对象内置的原型对象。对象内置的原型对象应该是对外不可见的,尽管有些浏览器(如Firefox)可以让我们访问这个内置原型对象,但并不建议这样做。内置的原型对象本身也是对象,也有自己关联的原型对象,这样就形成了所谓的原型链。在原型链的最末端,就是Object构造函数prototype属性指向的那一个原型对象。这个原型对象是所有对象的最老祖先,这个老祖宗实现了诸如toString等所有对象天生就该具有的方法。在原型继承的过程中,对象可以掩盖原型对象的那些属性和方法,一个构造函数原型对象也可以掩盖上层构造函数原型对象既有的属性和方法。这种掩盖其实只是在对象自己身上创建了新的属性和方法,只不过这些属性和方法与原型对象的那些同名而已,本质上属于衍生的属性和方法掩盖了本源的定义。

3.闭包。所谓的“闭包”,就是在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层外层函数体中的临时变量。这使得只要目标对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值

4.对于继承关系的属性方法讨论。基类构造函数中定义的方法在子类的构造中是唯一的,与子类.prototype.method添加的方法类似,子类成员维持共享的一份属性和方法。
function Person(){
this.name="Kelvin";
this.MyMethod = function(){alert(this.name)};
}
function Employee(){
this.empMethod = function(){};
}
Employee.prototype = new Person(); //定义Employee的原型为Person
Employee.prototype.NewMethod = function(){}; //定义一个类型.prototype.方法式的方法
var Jobs = new Employee();
var Bill = new Employee();
Jobs.MyMethod(); //调用Person内部定义的方法,显示Kelvin
alert(Jobs.empMethod === Bill.empMethod); //false,各自保存一份方法副本
alert(Jobs.MyMethod === Bill.MyMethod); //true,基类中定义的方法,子类拥有一个副本
alert(Jobs.NewMethod === Bill.NewMethod); //true,原型通过prototype.方法定义的方法,对象拥有一个副本

5.Leadzen构造的几个函数,号称甘露模型。
New()类型自建关键字:
function New(Class, args){
  function new_(){
  Class.Create.apply(this,args); //前提是作为类的对象中存在Create函数,用来初始化类对象的内部数据
  }
  new_.prototype = Class;
  return new new_();
}