js面向对象关键点

函数加new 工作流程:

(1) 创建一个新对象; => var this = new Object();
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) ;
(3) 执行构造函数中的代码(为这个新对象添加属性) ;
(4) 返回新对象

this: 谁调用的函数 this就指向谁

创建的每个函数都有一个 prototype (原型)属性.

当调用构造函数创建一个新实例后,
该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象。
ECMA-262 第 5 版中管这个指针叫 [[Prototype]] 。
虽然在脚本中没有标准的方式访问 [[Prototype]] ,
但 Firefox、Safari 和 Chrome 在每个对象上都支持一个属性__proto__

每当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。搜索首先
从对象实例本身开始。如果在实例中找到了具有给定名字的属性,则返回该属性的值;如果没有找到,
则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性。如果在原型对象中找到了这
个属性,则返回该属性的值。也就是说,在我们调用 person1.sayName() 的时候,会先后执行两次搜
索。首先,解析器会问: “实例 person1 有 sayName 属性吗?”答: “没有。 ”然后,它继续搜索,再
问: “ person1 的原型有 sayName 属性吗?”答: “有。 ”于是,它就读取那个保存在原型对象中的函
数。当我们调用 person2.sayName() 时,将会重现相同的搜索过程,得到相同的结果。而这正是多个
对象实例共享原型所保存的属性和方法的基本原理。

call :  

call:函数的一个方法,
call方法的第一个参数可以改变函数执行过程中的内部this的指向;
call方法从第二个参数开始就是原来函数的参数列表;
如果call方法传入的第一个参数是null,那么就是不改变函数内部的this指向的。

function show(){
alert(this);
}

show(); //这是函数调用的简写 弹出window
show.call(); //调用函数 也就是说:show() 可视为等同于show.call() 弹出window
show.call('caonima') //弹出caonima,因为在show里面的this变成了caonima。
show.call(123) //弹出123,因为在show里面的this变成了123。

  

原文地址:https://www.cnblogs.com/caonima-666/p/6763109.html