【problem】更改原型对象的方法

现有一个 Page 类, 其原型对象上有许多以 post 开头的方法 (如 postMsg); 另有一拦截函数 chekc, 只返回 ture 或 false. 请设计一个函数, 该函数应批量改造原 Page 的 postXXX 方法, 在保留其原有功能的同时, 为每个 postXXX 方法增加拦截验证功能, 当 chekc 返回 true 时继续执行原 postXXX 方法, 返回 false 时不再执行原 postXXX 方法

function Page() {}

Page.prototype = {
  constructor: Page,

  postA: function (a) {
    console.log(‘a:‘ + a);
  },
  postB: function (b) {
    console.log(‘b:‘ + b);
  },
  postC: function (c) {
    console.log(‘c:‘ + c);
  },
  check: function () {
    return Math.random() > 0.5;
  }
}

function checkfy(obj) {
  for (var key in obj) {
    if (key.indexOf(‘post‘) === 0 && typeof obj[key] === ‘function‘) {
      (function (key) {
        var fn = obj[key];
        obj[key] = function () {
          if (obj.check()) {
            fn.apply(obj, arguments);
          }
        };
      }(key));
    }
  }
} // end checkfy()

checkfy(Page.prototype);

var obj = new Page();

obj.postA(‘checkfy‘);
obj.postB(‘checkfy‘);
obj.postC(‘checkfy‘);

参考:GitHub

我的理解:在 checkfy() 函数内部,因为 fn.apply() 调用,所以自调用的参数 key 才会接受 obj 的方法执行时的参数?

也不是很理解原理。

时间: 2024-10-26 13:46:17

【problem】更改原型对象的方法的相关文章

浅谈JS中的构造函数、原型对象(prototype)、实例中的属性/方法之间的关系

原文链接:https://segmentfault.com/a/1190000016951069 构造函数:函数中的一种,通过关键字new可以创建其实例.为了便于区分,通常首字母大写:原型对象:一种特殊的对象,构造函数创建时自动生成:与构造函数形成一一对应,如同人和影子般的关系:实例:通过构造函数实例出来的对象: 在定义构造函数时,在其内部(“{“和”}”)进行定义属性和方法.当我们通过关键字new,对构造函数进行实例化的时候.实例会对构造函数的这些属性进行拷贝出一份副本,然后将其归属为当前实例

原型和原型对象(__proto__和prototype)转

看了之后我总算对原型继承有了更深刻的理解,做爱分享的姑娘,原文链接:理解Javascript 原型 我(个人)不喜欢的,就是讲原型时上来就拿类做比较的,所以我不会这样讲.不过我的确讲过构造器函数,在这方面和类多多少少有共通之处.我的建议是:忘掉类.有很多观点认为“类”学的泛滥是面向对象的过度发展,是一种悲哀,以至于有太多的开发者几乎把面向对象和类划上了等号.在学习原型之前,我请你先记住并品味这句话: 面向对象设计的精髓在于“抽象”二字,类是实现实体抽象的一种手段,但不是唯一一种. prototy

怎样修改原型对象prototype

修改原型对象的方法分为两种情况, 一种是对原型对象的属性方法做增删改, 一种改变原型对象的指向. 第一种: 对原型对象的属性/方法做增删改 function Person(name){ this.name = name; } var lilei = new Person("Lilei"); // 增 Person.prototype.getName = function (){ return this.name; } lilei.getName(); // "Lilei&qu

js原型对象与Java类的区别

在我学习Javascript的原型对象时,我总是不自觉地拿Java的类思想来做比较,时间久了,我渐渐认识到二者有巨大的不同. 首先,类是不能直接当方法来运行,它最简便的方式是调用其静态方法:而原型对象本身就是一个方法体,它可以直接运行.二者在构造对象的过程中,js可以扮演两种角色,一个可以将原型对象当方法来使用,才接触js时,都是以这种形式来使用,即万物皆方法体,像c;另一个是模仿面向对象的特性,为原型对象定义属性,运用构造器时,将构造器构造的对象的指针指通过原型链指向原型对象的属性,从而实现面

原型,原型对象,原型链,构造函数,继承(一)

前言:javascript中 万物皆对象 , 但是对象是有区别的 分为普通对象(object)和函数对象(function): ①由以下三种形式创建的对象为函数对象: function fun1(){} var fun2 = function(){} var fun3 = new Function(); console.log(typeof fun1);//function console.log(typeof fun2);//function console.log(typeof fun3);

面向对象-原型对象

创建对象 Js中可以用构造函数模式创建对象,如: function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function () { alert(this.name); } } var person1 = new Person("Nicholas", 29, "aa"); var person2 = new Person(&q

【JavaScript】动态原型模式创建对象 ||为何不能用字面量创建原型对象?

var proto = ""; function Person(name, age, job) { this.name = name; this.age = age; this.job = job; if (typeof this.sayname != 'function') { //这里不能使用字面量创建原型对象 //Person.prototype.sayname = function() { // console.log("name = " + this.na

原型对象指向可以改变

原型对象的指向改变 function Person(age){ this.age=10; //在构造函数中的方法 } //人的原型对象的方法 Person.prototype.eat=function(){ console.log("人的吃"); } //学生的构造函数 function Student(){ } Student.prototype.sayHi=function(){ console.log("学生hi"); }; //学生的原型,指向了一个人的实例

人人都能懂的原型对象

提到JS中的对象,我们就不得不提JS对象中的原型.我们知道,JS是可以面向对象编程的语言,通常在面向对象中,继承关系都是通过类来实现的.但是,请记住,在JS中,并没有类的概念.在JS的设计之初就没有类,那么在JS中,继承是通过什么来实现的呢?答案就是原型. 每一个构造函数都有一个与之相关联的对象,该对象称之为原型对象.每个实例对象都能共享其原型对象上的属性和方法.原型对象的作用主要用来实现属性的继承,让实例对象能共享原型对象的属性,减少内存分配.所以,在上一节中,我们想在每个Person对象中共