zoukankan      html  css  js  c++  java
  • javascript 中关于function中的prototype

      在javascrpit中每个函数中都有一个prototype属性,在其创建的时候,无论是用var method = function(){}或者 var method = new Function()或者function method(){}三种方法中哪一种方法去创建这个变量,其中都会自带有prototype属性。prototype属性是一个对象,其中默认会含有constructor属性。该属性是指向函数本身的一个指针。

      向上面定义的method方法,如果该方法时一个构造函数,那个用该构造函数创建的新的对象:如 var m = new method();(一般构造函数首字母为大写以示区分,这里忽略)。那么该m中有一个指向原型的指针[_proto_],这个指针直接是访问不到的,需要通过Object.getPrototypeOf()方法去访问,亦或通过m.constructor.prototype去访问。

      比如在method.prototype中定义一个方法,method.prototype.sayHello = function(){alert("hello");};。那么新对象m中也可以直接调用这个方法。m.sayHello();这时候会弹出警告框hello。每个对象中属性查询的顺序是先查找对象本身中有没有该属性,如果没有,就会查找该对象的原型,原型的原型,直至最顶层的Object或者找到该属性为止,如果没找到则会返回undefined。这里就可以理解上面通过m.constructor.prototype去访问自己构造函数prototype的原理了。m本身中是没有constructor这个构造函数指针的,所以会去查找m的[_proto_]所指向的原型中有没有constructor。有因为m的[_proto_]是指向method.prototype,那么肯定包含constructor指针指向method本身,而prototype又是method中的属性,所以绕几个弯以后就可以访问到[_proto_]所指向的原型对象了。

      这里值得注意的是如果一个对象是Function类型的,那么本身包含的prototype和[_proto_]是完全不同的两个概念。还是按照上面举的例子来说,关于这个method对象,如果是method.constructor,那么指向的就是Function,如果是method.prototype.constructor ,那么指向的就是method本身。method.constructor.prototype = Function.prototype 。所以说method.prototype.constructor和method.constructor.prototype是完全不同的两个概念,虽然只是顺序不同。这里Function.prototype还是一个function类型的对象,其中我们常用的arguments,call,apply,caller这些都是在这个function对象里面所定义的。

  • 相关阅读:
    ClickOnce發布經驗
    reporting Server組件不全引起的致命錯誤
    異步調用
    Usercontrol Hosted in IE
    MATLAB命令大全(转载)
    一种保护眼睛的好方法
    关于oracle自动编号
    An Algorithm Summary of Programming Collective Intelligence (1)
    An Algorithm Summary of Programming Collective Intelligence (3)
    An Algorithm Summary of Programming Collective Intelligence (4)
  • 原文地址:https://www.cnblogs.com/cmxwt/p/7262033.html
Copyright © 2011-2022 走看看