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原型链里的对象。

浙公网安备 33010602011771号