原型模式Prototype,constructor,__proto__详解

最近由于在找工作,又拿起《JavaScript高级程序设计》看了起来,从中也发现了自己确实还是有很多地方不懂,刚刚看到原型模式这里,今天终于搞懂了,当然,我也不知道自己的理解是否有错。

1、prototype

开头第一句话说,我们每创建一个函数,就会有一个prototype属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含由特定类型或者实例共享的属性和方法。

function fn(){};
console.log(fn.prototype);

其实

其实我们创建函数就是调用构造函数Function来实现的,其原型对象就是Object(),而这里,fn的原型对象就是Object()。

2、constructor

在默认情况下,所有的原型对象都会获得一个constructor属性,这个属性包含一个指向prototype属性所在的函数指针。

这句话怎么理解呢?其实很简单,先看代码:

function Parent(name,age){
    Parent.prototype.name=name;
    Parent.prototype.age=age;
    Parent.prototype.arr=["123","we"];
    Parent.prototype.sayHi=function(){
        console.log("Hi");
    };
}

console.log(Parent.prototype.constructor===Parent);//true

这里Parent是构造函数,Parent.prototype才是原型对象。当哦们创建了自定义构造函数之后,Parent.prototype就会默认获得constructor属性,并且Parent.prototype.construtor=Parent,而上面的代码也说明了这一点。

我也测试了一下其他函数,看了下结果:

var t= new Parent("huan",12);

console.log(Parent.constructor);//function Function

console.log(t.constructor);//function Parent()

那这里又要如何解释呢?这里先放一个疑问,后面再来解释。

3、__proto__

3

当采用构造函数创建一个实例之后,该实例内部都会有一个指针(_proto_)指向构造函数的原型对象。

即:它是连接实例和原型对象的,而不是实例和构造函数。也就是存在下面这种关系:

t.__proto__=Parent.prototype

这样我们就可以来解答上面留下的疑问了:

函数Parent,t都是自身本身没有construtor属性,这属性是从原型对象上继承下来的。

因为t的原型对象是Parent.prototype,而Parent.prototype.construtor=Parent,所以最后输出的就是Parent。

同理,Parent的原型对象是Function.prototype,而Function.prototype.construtor=Function,所以最后输出的就是Function。

ba

4、总结

Parent.prototype指向了原型对象,而Parent.prototype.construtor又指回了Parent;Parent的每一个实例都包含一个内部属性__proto__,该属性指向Parent.prototype。实例虽然不包含方法和属性,但却可以通过查找获得。

注意事项:

1、用新对象替换prototype属性,会删除默认构造函数属性。也就会破坏construtor属性的值。

2、用新对象替换prototype属性不会更新以前的实例。

具体可看下面的代码

var Foo=function Foo(){};
Foo.prototype.x=1;
var foo=new Foo();

Foo.prototype={x:2,constructor:Parent};
var foo1=new Foo();

console.log(foo.x); //1
console.log(foo1.x);//2
console.log(foo1.constructor===Foo);//flase
console.log(foo.constructor===Foo);//true
console.log(foo1.constructor===Parent);//true
console.log(foo.constructor===Parent);//flase
时间: 2024-10-21 13:08:28

原型模式Prototype,constructor,__proto__详解的相关文章

prototype constructor __proto__

constructor, prototype, __proto__ 详解

设计模式 - 迭代器模式(iterator pattern) 扩展 详解

迭代器模式(iterator pattern) 扩展 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式-Java迭代器: http://blog.csdn.net/caroline_wendy/article/details/35268931 扩展迭代器模式, 添加一个Hashtable存储的类. 具体方法: 1. Hashtable的类, 包含创建value()的迭代器(iterator). /** * @time 2014年6月27日

Design Patterns 5 原型模式 Prototype

原型模式 Prototype 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 当我们需要多个相同的类实例时,没必要每次都使用new运算符去创建相同的类实例对象,我们可以用原型模式减少内存的消耗和达到类实例的复用. //带有返回自身接口的抽象原型类 public abstract class Prototype5 { public string Id { get; set; } public Prototype5(string id) { this.Id = id;

设计模式之代理模式 c++实现以及详解

proxy模式 <1> 作用: 为其他对象提供一种代理以控制对这个对象的访问. <2> 代理模式的应用场景: 如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法: 1.修改原有的方法来适应.这样违反了"对扩展开放,对修改关闭"的原则. 2.就是采用一个代理类调用原有的方法,且对产生的结果进行控制.这种方法就是代理模式. 使用代理模式,可以将功能划分的更加清晰,有助于后期维护! <3> 结构图 代理类,含有一个指向RealSubject

二十四种设计模式:原型模式(Prototype Pattern)

原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 示例有一个Message实体类,现在要克隆它. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Prototype { /// <summary> /// Message实体类 /// </summary> publi

谈谈设计模式~原型模式(Prototype)

返回目录 原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例(clone),而不是新建(new)实例.被复制的实例就是我们所称的“原型”,这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效:或者创建值相等,只是命名不一样的同类数据. 从原型模式的概念中,我们可以看到,在这个模式里,拷贝是个很重要的概念,即在不创建对象的情况下,返回一个已有对象,这就是拷贝去实现的,在面向对象的编程世界里,拷贝分为浅拷

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 参考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/de

设计模式 - 模板方法模式(template method pattern) 详解

模板方法模式(template method pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template method pattern): 在一个方法中定义一个算法的骨架, 而将一些步骤延迟到子类中. 模板方法使得子类可以在不改变算法结构的情况下, 重新定义算法中的某些步骤. 模板方法可以进行挂钩(hook), 钩子(hook)是一种被声明在抽象类中的方法, 但只有空的或者默认的实现. 钩子的存在, 可以让子类有能力

js高级构造函数,实例对象和原型对象——prototype、__proto__和constructor构造器

一.前言 了解JavaScript面向对象,需要先了解三个名词: 构造函数,实例对象和原型对象. 注意:JavaScript中没有类(class)的概念,取而代之的是构造函数,两者类似却又有很大的差别. 先上代码,最常用的: function Person(name, age) { this.name = name; this.age = age; this.eat= function() { alert('吃西红柿') } } var person1 = new Person('小米', 28