js笔记1---new创建实例

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操作符创建Person实例经历的过程是:

1、创建一个新对象;

2、将构造函数的作用域赋给新对象(因此this指向了这个新对象);

3、执行构造函数中的代码(为这个新对象添加属性);

4、返回新对象;

具体代码表示为:

var person1 = {};
person1._proto_ = Person.prototype;
Person.call(person1);

即:

1、  创建一个空对象person1;

2、 将person1的_proto_指向Person函数对象的prototype(原型链);

  _proto_简单概要为,在javascript中每个对象都会有一个_proto_属性,当访问一个对象时候,如果对象内部不存在,就会去_proto_对象下面找,这个_proto_下面又包含其他对象,一直往下找。

3、call的用法。

  call与apply用法差不多,不同点在于参数形式不同。call方法的主要用途为:

    (1)继承;

    (2)修改函数运行时的this指针(this指针理解:this指针的作用域不是定义它的函数的作用域,而是执行时的作用域)

  call的用法原理可以表示为:

f.call(o);
该代码可以理解为(假设对象o中预先不存在名为m的属性)
o.m = f; //将f存储为o的临时方法;
o.m();     //调用它,不传入参数
delete o.m; //将临时方法删除

  即使f将o的方法执行一遍,但不做保存。而且调用call方法后,修改this指针发生修改,指向f;

个人理解:

1,为什么需要第2、3步骤?

  第3步骤能取到Person里的方法,但不能取得Person prototype对象里的,而第2步骤会将取到Person原型链里的对象。

 

 

 

 

 

 

 

 

posted @ 2017-09-08 17:47  livingWolf  阅读(227)  评论(0)    收藏  举报