JS的构造函数和原型

创建对象的几种方式

  1. 字面量创建
  2. 构造函数创建
  3. Object.create()
  4. 工厂模式
var o1 = {name: 'value'};
var o2 = new Object({name: 'value'});

var M = function() {this.name = 'o3'};
var o3 = new M();

var P = {name: 'o4'};
var o4 = Object.create(P)

function createGf(name, bar) {
    var o = new Object();
    o.name = name;
    o.bar = bar;
    o.sayWhat = function() {
        alert(this.name + "said:love you forever");
    }
    return o;
}
var gf1 = createGf("bingbing","d");
var gf2 = createGf("mimi","a");

理解原型对象

当我们创建一个函数时,该函数就会具备一个prototype属性,这个属性指向通过构造函数创建的那个函数的原型对象。通俗点讲原型对象就是内存中为其他对象提供共享属性和方法的对象。
在这里插入图片描述

function Gf(){
    Gf.prototype.name = "vivian";
    Gf.prototype.bar = "c++";
    Gf.prototype.sayWhat = function(){
        alert(this.name + "said:love you forever");
    }
}
var gf1 = new Gf();
gf1.sayWhat();
var gf2 = new Gf();

和构造函数不同的是这里新对象的属性和方法是所有实例都可以共享的,换句话说gf1和gf2访问的是同一份属性和方法。原型对象中除了我们赋予的属性外,还有一些内置的属性,所有原型对象都具备一个constructor属性,这个属性是一个指向包含prototype属性函数的一个指针(敢不敢再绕点!)。

在这里插入图片描述
所有的对象都有一个原型对象(prototype),原型对象中有一个constructor属性指向包含prototype属性的函数,Gf的实例gf1和gf2都包含一个内部属性指向原型对象(在firefox浏览器中表现为私有属性proto),当我们访问一个对象中的属性时,首先会询问实例对象中有没有该属性,如果没有则继续查找原型对象。

猜你喜欢

转载自blog.csdn.net/Gainsense/article/details/88595656