Javascript原型三

13次阅读

共计 1150 个字符,预计需要花费 3 分钟才能阅读完成。

代码分析(一)

function Phone(ram) {
    this.ram = ram;
    this.call = function(){}
}
var p = new Phone("16GB");
var q = new Phone("32GB");
  • 首先分析构造函数 Phone,定义一个 Phone 构造函数(因为下面是要对此函数使用 new 操作创建新对象的,所以这里说
    Phone 是构造函数,其实如果说 Phone 是一个普通函数也是可以的)

    function Phone(ram) {
        this.ram = ram;
        this.call = function(){}
    }

    注意:

    1. 在此图中,并没有 ramcallramcall 是构造函数体里的东西,是构造函数通过 new 创建出的对象里的属性(绝对不要理解成是构造函数本身的属性),也就是说 this.ram=ram,是新创建出来的对象里面有个ram 属性,值是创建对象时从外部传递进来的值。
    2. 构造函数本身有什么属性呢?构造函数本身有 name 属性,凡是函数都有一个属性叫做 name。比如Person 这个构造函数,它的 name 属性值就是 Person;而 `var
      person = function(){…}; 像这样的声明,name 属性的值就是person`。如下图所示:

以上代码完整的图如下所示:

代码分析(二)

function Phone() {this.ram = "16GB";}
Phone.prototype.call = function(){}
var p = new Phone();
var q = new Phone();

  • Phone构造函数中有 prototype 原型属性,此属性指向原型
  • 原型中有 constructor 属性,此属性指向构造函数
  • 原型有 call 属性,此属性指向一个函数
  • 通过 Phone 构造函数,实例化出了两个对象,这两个实例对象中分别都有 __proto__ 原型对象属性,此属性指向原型,与 Phone 构造函数中的 prototype 属性指向的是同一对象
  • 正是由于 pq对象都指向同一个原型对象,所以当调用 p.call() 或者 q.call() 的时候,即使实例化对象本身中不存在此方法,此方法也会正常执行,因为实例化对象中没有,就会自动去原型中查找,原型中有,就调用了,这也就是原型继承
  • 开发中的用法是在构造函数中定义属性,在原型中定义方法

代码分析(三)

function Phone(){this.ram = "16GB";}
Phone.prototype = {sayHello: function(){}};
var p = new Phone();
var q = new Phone();

内存图如下所示:

右上角的刚开始的原型对象(有 constructor 的),没有任何属性指向它了,时间长了,它就被回收了,但是在没回收之前,它是存在的,并不是一没有东西指向它了,它就消失了。

正文完
 0