美文网首页
JavaScript创建对象(三)——原型模式

JavaScript创建对象(三)——原型模式

作者: Bob2100 | 来源:发表于2018-09-30 10:29 被阅读0次

在《JavaScript创建对象(二)——构造函数模式》中提到,构造函数模式存在相同功能的函数定义多次的问题。本篇文章就来讨论一下该问题的解决方案——原型模式。

首先我们来看下什么是原型。我们在创建一个函数时,这个函数会包含一个属性`prototype`,这个属性是一个指针,它指向一个对象——该函数的原型对象,这就是原型,它包含了该函数类型的所有实例可共享的属性和方法,见下面示意图:

原型示意图

如图所示,声明了一个函数`Person`。在JavaScript中,一个函数被声明的同时就具有了一些属性,其中有一个叫做`prototype`,它指向了该函数的原型对象,即上述示例中的`Person Prototype`。同时,这个原型对象有一个叫做`constructor`的属性反过来又指向了该函数对象。

当我们创建一个函数的实例时,例如上面的`var personObj = new Person('张三', 12);`,这个实例也会有一个属性指向该函数的原型对象,在Chrome的开发工具中显示为`__proto__`。

上面我们说原型的属性可以被该函数类型的所有实例所共享,那具体是怎么实现呢?看下面的示例:

```javascript

function Person(){

}

//给原型添加自定义属性和方法

Person.prototype.name = '张三'; 

Person.prototype.sayName = function(){

    console.log(this.name);

}

var p1 = new Person();

//给p1添加age属性

p1.age = 18;

console.log(p1.name);//张三

console.log(p1.age);//18

p1.sayName();//张三

var p2 = new Person();

console.log(p2.name);//张三

console.log(p2.age);//undefined

p2.sayName();//张三

```

在上面的代码中,我们并没有给实例添加`name`属性和`sayName`方法,但是依然可以通过实例调用,貌似实例天生就具有了原型的属性和方法,其实不是的,下面是在Chrome的开发工具中看到的内容:

原型属性

相关文章

  • 原型模式(一)

    原型模式(一) 在Javascript中一切皆是对象,所以我们会创建很多对象。那么就来看看创建对象的方法.原型模式...

  • 链式操作

    对象字面量创建对象 构造函数创建对象 构造函数和原型一起创建对象 参考 JavaScript设计模式 --- 方法...

  • 原型和原型链

    一、理解原型设计模式以及 JavaScript 中的原型规则 设计模式 工厂模式 在函数内创建一个对象,给对象赋予...

  • 关于JavaScript创建对象的多种方式

    JavaScript创建对象的方法 工厂模式 构造函数模式 原型模式 组合使用构造函数模式和原型模式 动态原型模式...

  • JavaScript创建对象

    JavaScript中创建对象有以下七种方式: 工厂模式构造函数模式原型模式构造函数和原型组合模式动态原型模式寄生...

  • 设计模式-原型模式

    5、原型模式原型模式是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,属于创建型模式。创建原型接口...

  • 重学设计模式之原型模式

    原型模式 定义 使用原型实例指定创建对象的种类,并且通过克隆这些原型创建新的对象。原型模式是一种对象创建型模式。 ...

  • JavaScript创建对象(三)——原型模式

    在《JavaScript创建对象(二)——构造函数模式》中提到,构造函数模式存在相同功能的函数定义多次的问题。本篇...

  • JavaScript创建对象的高级方法

    创建对象的方法 读《JavaScript高级程序设计》所得。 工厂模式——》构造函数模式——》原型模式——》构造函...

  • JavaScript设计模式——原型模式

    原型模式: 原型模式是指原型实例指向创建对象的种类,并通过拷贝这些原型创建新的对象,是一种用来创建对象的模式,也就...

网友评论

      本文标题:JavaScript创建对象(三)——原型模式

      本文链接:https://www.haomeiwen.com/subject/ffoioftx.html