蝴蝶书中有一个method方法,用来给函数定义方法。看了之后,想着能不能给对象也定义方法呢?、

下面的代码可以实现给函数定义方法:

 //Function method
Function.prototype.method = function (name,func) {
this.prototype[name] = func;
return this;
}

在实现给对象定义方法的过程中,我遇到了一些问题,对象是没有prototype的。

经过思考,用下面的方法实现了给对象定义方法的功能,但是比较繁琐:

//Object method
Object.prototype.method = function (name,func) {
Object.prototype[name] = func; //不能用this,因为a没有prototype属性
return this;
}
//该方法的缺点是,一旦给某对象定义了方法,所有对象都将拥有该方法。

关于prototype和__proto__的思考:

var Person = function(arg1,arg2,...){};
var p = new Person();

等价于(某些情况下):

 var p={};  //也就是说,初始化一个对象p。
p.__proto__=Person.prototype;
Person.call(p,arg1,arg2,...); //也就是说构造p,也可以称之为初始化p(没有这一步,p是空的)。

其中:
p.__proto__ == Person.prototype;
Person.prototype:
Object {constructor: function}
函数Person的prototype是Person的一个属性,该属性是个对象,这个对象是p的原型。。

另外,由于 Person.call(p,arg1,arg2,...)构造p

使得p.construtor === Person();

我们生成一个Object和一个Function的来探寻这些内容的关系:
var a = new Object();
var b = new Function();

a.__proto__ == Object.prototype;
b.__proto__ == Function.prototype;

低层次,以下3个指向同一内容。
function () { [native code] }
1、 Function.prototype
2、 Object.__proto__
3、 Function.__proto__

高层次,以下4个指向同一内容。
Object {__defineGetter__: function, __defineSetter__: function, hasOwnProperty: function, __lookupGetter__: function, __lookupSetter__: function…}
1、 Object.prototype
2、 Function.prototype.__proto__
3、 Object.__proto__.__proto__
4、 Function.__proto__.__proto__
所以只有Function method,不定义Object method我们也照样会看到Object.method;
但是对于

var a = new Object();

Object并不是a的原型,所以a也不存在method方法。a的原型在高层次。
此时,我们为Object.prototype定义method方法,这是a的上级原型链,a就有了method方法.

注意:
既然Object method层次更高,就算没有Function method也无所谓。但是这可能涉及安全性问题。
如果既有Function method又有Object method
我们给Function添加method方法时,会调用Function method(从低向高查找method)
我们给Object添加method方法时,会调用Object method

最后一个例子:

var arr = new Array();
arr.__proto__ === Array.prototype;
//true
arr.constructor === Array;
//true
arr.__proto__ === arr.constructor.prototype;
//true

给对象和函数添加method方法的更多相关文章

  1. 你会如何给全局对象添加toString()方法

    首先,在讨论如何给所有方法window对象添加toString方法的时候,我们先来说说window的对象继承与对象实例,以及构造函数的this指针,还有变量的提升与方法的调用方式,最终一探window ...

  2. JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法

    函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...

  3. 设计模式---对象创建模式之工厂方法模式(Factory Method)

    前提:“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式(表现最为突出) 工 ...

  4. RegisterUserFunc为测试对象添加新方法或重写已有方法

    QTP中为了提高扩展性,提供了一个为测试对象添加一个新的自定义方法,或者重写测试对象已有的方法的函数RegisterUserFunc,在此给大家分享一下. RegisterUserFunc:为测试对象 ...

  5. jQuery源码06-jQuery = function(){};给JQ对象,添加一些方法和属性,extend : JQ的继承方法,jQuery.extend()

    /*! * Includes Sizzle.js 选择器,独立的库 * http://sizzlejs.com/ */ (function( window, undefined ) { //" ...

  6. 275 原型与原型链:显式原型prototype ,隐式原型__proto__,隐式原型链,原型链_属性问题,给原型对象添加属性/方法

    1.所有函数都有一个特别的属性 prototype : 显式原型属性 [普通构造函数的实例对象没有prototype 属性,构造函数有__proto__属性,原型对象有__proto__属性 ] 2. ...

  7. 在Function对象上扩展method方法

    ;(function() { /** * 在Function对象上扩展method方法 * @param {String} name 扩展的方法名称 * @param {Function} callb ...

  8. C++11用于计算函数对象返回类型的统一方法

    [C++11用于计算函数对象返回类型的统一方法] 模板 std::result_of 被TR1 引进且被 C++11 所采纳,可允许我们决定和使用一个仿函数其回返值的类别.底下,CalculusVer ...

  9. 函数对象的call()、apply() 方法区别

    函数对象的call().apply() 方法 函数作为对象提供了call(),apply() 方法,他们也可以用来调用函数,这两个方法都接受一个对象作为参数,用来指定本次调用时函数中this的指向: ...

随机推荐

  1. update-alternatives命令详解

    转载:http://blog.csdn.net/maixia24/article/details/11707289 update-alternatives是ubuntu系统中专门维护系统命令链接符的工 ...

  2. SQLSERVER CROSS APPLY 与 OUTER APPLY 的应用

    日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某一条或多条记 ...

  3. BASE64Encoder及BASE64Decoder编译器找不到问题

    编译器自带这两个类,但是会报错找不到,需要手动让编译器识别这个类 第一步.右键项目,然后选择properties 第二步,打开如图位置 第三部,选择如图位置,双击 第四部,add添加 更改值 改为如图 ...

  4. 关于Spring Data redis几种对象序列化的比较

    redis虽然提供了对list set hash等数据类型的支持,但是没有提供对POJO对象的支持,底层都是把对象序列化后再以字符串的方式存储的.因此,Spring data提供了若干个Seriali ...

  5. js 中的 2 与 "2"

    case1: "15" * 2 结果:30 case2: 2 * "15" 结果:30 case3: "2" * "15" ...

  6. 支付宝 iOS SDK 官方下载页面[转]

    from:http://blog.sina.com.cn/s/blog_6f72ff900102v0sw.html 藏得太深了,不得不记下来!     官方页面地址:   https://b.alip ...

  7. 解决 sublime text 3 右键菜单栏出现多余的菜单项分隔符的问题

    很早之前装了一个插件 JavaScript Completions,虽然还没有用过它的高级功能,但随着 sublime text 3 逐渐成为我主要的编程工具,最近发现在右键点击文件出现的菜单栏中,菜 ...

  8. Hook ptrace 调试加入了ptrace函数的程序

    Hook ptrace 调试加入了ptrace函数的程序 #import <substrate.h> #if !defined(PT_DENY_ATTACH)#define PT_DENY ...

  9. 自我介绍及如何注册GITHUB

    自我介绍 我是来自南通大学网络工程141班的周楠,我的学号是1413042014,我的兴趣是喜欢玩游戏(如果这算是一个兴趣爱好的话),喜欢尝试各种游戏. 如何注册一个GitHub账号? 1.首先我们需 ...

  10. centos 中 mongodb 启动失败的修复

    mongodb是使用centos的yum命令安装的,整个的安装过程如下: 1. 运行 yum info mongo-10gen查看是否有mongodb源,如有跳至第3步. 2. 运行 vim /etc ...