给对象和函数添加method方法

蝴蝶书中有一个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();

等价于:

1 var p={};  //也就是说,初始化一个对象p。
2 p.__proto__=Person.prototype;
3 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

时间: 2024-11-13 12:41:15

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

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

首先,在讨论如何给所有方法window对象添加tostring方法的时候,我们先来说说window的对象继承与对象实例,以及构造函数的this指针,还有变量的提升与方法的调用方式,最终一探window对象与Window方法(函数)的处理方式. 在说window对象之前,请让我们一起写一个实例的方法暖暖身,跳水之前应该做热身动作,虽然我们不跳水,不过写代码也需要做一个热身,这样才能适应下面的高难度动作. 废话好多,裁判看不下去了,开始准备你的姿势,让我们开场就拿个满分,吓死裁判,但是看到裁判吓到自

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

/*! * Includes Sizzle.js 选择器,独立的库 * http://sizzlejs.com/ */ (function( window, undefined ) { //"use strict"; var // rootjQuery = jQuery(document) = $();压缩有用 rootjQuery, // dom是否加载完 readyList, // core_strundefined == 'undefined' core_strundefined

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

函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留言告诉我, 谢谢).因为调用对象是作用域链的一部分,所以在函数体内可以把这个对象属性作为变量来访问. 调用对象的属性包括:用var声明的局部变量,函数形参,还有一种特殊的属性arguments 函数的实际参数:实际参数对象 arguments对象,用来引用实际参数对象.函数的arguments对象并

黑马程序员-OC学习日记-对象与方法、对象与函数

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.NSString类简介 1.NSString是OC中用来表示字符串的一个类 2.NSString类创建 (1)通过字面量方式创建 NSString * str = @"要努力学习!"; (2)通过对象方法创建 NSString * str1 = [NSString alloc]; str1 = [str1 initWithUTF8String:"今天雾霾好大!"

vue 添加对象的新属性的方法

和数组一样,Vue 不能检测到对象属性的添加或删除.由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的. 两种不同情况下使用的方法: Vue.set(object, key, value) Vue.set(vm.someObject, 'b', 2) vm.$set this.$set(this.someObject,'b',2) 如果想向已有对象上添加一些属性,例如使用 Object.

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

函数对象的call().apply() 方法 函数作为对象提供了call(),apply() 方法,他们也可以用来调用函数,这两个方法都接受一个对象作为参数,用来指定本次调用时函数中this的指向: call()方法 call方法使用的语法规则 函数名称.call(obj,arg1,arg2...argN); 参数说明: obj:函数内this要指向的对象, arg1,arg2...argN :参数列表,参数与参数之间使用一个逗号隔开 var lisi = {names:'lisi'}; var

微信小程序 功能函数 将对象的键添加到数组 (函数深入)

// 将对象的键添加到数组 var arr = Object.keys(site); //英文 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys 中文 https://developer.mozilla.org/zh-CN/ https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Glo

jquery 源码学习(四)构造jQuery对象-工具函数

jQuery源码分析-03构造jQuery对象-工具函数,需要的朋友可以参考下. 作者:nuysoft/高云 QQ:47214707 EMail:[email protected] 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. 读读写写,不对的地方请告诉我,多多交流共同进步,本章的的PDF等本章写完了发布. jQuery源码分析系列的目录请查看 http://nuysoft.iteye.com/blog/1177451,想系统的好好写写,目前还是从我感兴趣的部分开始,如果大家有对哪

JavaScript (JS) 面向对象编程 浅析 (含对象、函数原型链解析)

1. 构造函数原型对象:prototype ① 构造函数独立创建对象,消耗性能 function Person(name) { this.name = name; this.sayHello = function () { console.log("Hello,my name is " + this.name) } } var P1 = new Person("Tom"); var P2 = new Person("Jim"); P1.sayHe