zoukankan      html  css  js  c++  java
  • 了解javascript编程中的Prototype(原型)

    日期:2012-5-16  来源:GBin1.com

    了解javascript编程中的Prototype(原型)

    当你定义javascript方法的时候,会产生一些预定义的属性,其中一个比较让人迷惑的属性就是prototype。在本文中,我们将详细介绍什么是Prototype,并且为什么使用prototype。

    什么是prototype?

    prototype属性初始时是一个空的对象,可以添加对象 ,你可以添加任何对象到它里面去。

    var myObject = function(name){
        this.name = name;
        return this;
    };
    console.log(typeof myObject.prototype); // object
    myObject.prototype.getName = function(){
        return this.name;
    };

    在以上这段代码中,我们创建了一个方法,但是如果我们调用myObject(),将会返回window对象,因为它被定义在全局范围中。 this将会返回全局对象,因为没有被实例化。

    console.log(myObject() === window); // true

    秘密的连接

    每一个javascript中的对象都有一个秘密属性。 

    在我们继续之前,我想讨论一下决定prototype工作方式的“秘密”连接。

    每一个javascript对象在定义或者实例化的时候都会添加一个秘密的属性,叫__proto__,这决定了prototype链如何被访问。然而,在你的应用中访问这个__proto__属性绝对不是一个好主意,因为不是所有浏览器都可访问。

    __prototype__ 属性在一个对象的prototype中不应该被弄混了, 因为它有两个分开的属性;意味着他们都是手拉手来使用的。对于弄清楚这个很重要。因为最开始的时候肯定比较令人迷惑。 那究竟什么意思呢? 这里我们解析一下。 当我们创建myObject方法时,我们定义了一个Function类型的对象。

    console.log(typeof myObject); // function

    如果你不知道的话, Function是一个javascript预定义的对象,这样的话,拥有自己的属性(例如,length和arguments)和方法(例如,call和apply)。这意味着,在javascript的引擎中,这里有类似如下代码的部分:

    Function.prototype = {
        arguments: null,
        length: 0,
        call: function(){
            // secret code
        },
        apply: function(){
            // secret code
        }
        ...
    } 
    当然可能没有这么简单;不过这里只是演示prototype的链式如何工作的。
    因此当我们定义myObject为一个方法并且提供一个参数name;但是并不设置其它属性和方法,例如length,和call,那么如下代码为什么可以工作?
    ...
    欢迎访问GBin1.com
  • 相关阅读:
    多线程(一)高并发和多线程的关系
    spring源码浅析——IOC
    网络爬虫(java)
    数据结构—平衡二叉树
    设计模式—抽象工厂模式
    设计模式—工厂方法模式
    scala(二) Future执行逻辑解读
    java异常处理机制
    为什么覆写equals必须要覆写hashCode?
    Scala对MongoDB的增删改查操作
  • 原文地址:https://www.cnblogs.com/gbin1/p/2506680.html
Copyright © 2011-2022 走看看