如何在JavaScript中创建“点函数”

qvsjd97n  于 2023-04-28  发布在  Java
关注(0)|答案(4)|浏览(133)

我试图定义一个“点函数”,其中没有参数,但有一个.和一个字符串或数字,像下面这样:
.toUpperCase()
.toLowerCase()
.索引()
.charAt()
.substring()
你做2..toString,而不是toString(2)
你如何定义其中一个?

wf82jlnq

wf82jlnq1#

定义一个“点函数”很容易。下面是如何在单个对象上定义它。

var a = {}, or a = function() {}, or a = [], etc.

a.dotFunction = function() { return 'hi'; }

console.log(a.dotFunction());

如果你想在一个“类”的所有示例上定义它,使用prototype

function someClass() {
}

someClass.prototype.dotFunction = function() { return 'hi'; };

console.log(new someClass().dotFunction());

你甚至可以在内置类型(有些,如Prototype。js,这样做,虽然大多数人建议反对它)。

Number.prototype.dotFunction = function() { return 'hi'; };

console.log((0).dotFunction());
insrf1ej

insrf1ej2#

我强烈建议不要尝试替换任何内置方法,但是,您可以自由地定义您自己的方法。
你可以通过将方法附加到NumberString类型的原型来实现:

Number.prototype.foo = function(n) { return this * n; };
String.prototype.bar = function(n) { return this.length * n; };

alert(4..foo(2));  // 8
alert("4".bar(2)); // 2

进一步阅读

yqkkidmi

yqkkidmi3#

我将向您展示如何添加函数点函数而不使用类。

const test = (data) => {
    if (!data.hasOwnProperty('reset')) {
        // If reset is not defined, then we can use Object.defineProperty
        Object.defineProperty(data, 'reset', {
            enumerable: false,
            configurable: false,
            value: function () {
                const keys = Object.keys(this);
                for (let i = 0; i < keys.length; i++) {
                    delete this[keys[i]];
                }
                return this;
            }
        });
    } else {
        // If reset is already defined, then we can't use Object.defineProperty
        delete this.reset; // Delete the reset property and then define it again
        Object.defineProperty(data, 'reset', {
            enumerable: false,
            configurable: false,
            value: function () {
                const keys = Object.keys(this);
                for (let i = 0; i < keys.length; i++) {
                    delete this[keys[i]];
                }
                return this;
            }
        });
    }

    return data;
}

const data = {
    name: 'NoNametxt',
    age: 30,
    reset: 1 // If reset is already defined, then we can't use Object.defineProperty and we have to delete the reset property and then define it again
}

console.log(test(data)); // { name: 'NoNametxt', age: 30 }
console.log(test(data).reset()); // { }
console.log(test(data)); // { }
ct2axkht

ct2axkht4#

我会给予一下,因为没有人提到你已经可以做到这一点,而不必自己定义任何东西。
需要注意的一件事是,如果你有一个数字,你必须在它后面放置两个点,就好像你有一个函数返回一个数字或一个变量,你没有:

1..toString()
 .indexOf("1")//<=returns number 0
 //even though a number is returned we only need one dot here
 .toString();//<="0"

var num = 1234;
num.toString()//<=one dot
  .indexOf("23");//<=1

你的例子已经可以工作了,但是因为indexOf会返回一个数字,如果你给予它一个有意义的参数,而一个数字没有charAt方法。

"hello".toUpperCase()
  .toLowerCase()
  .indexOf("h")//<=returns a number 
               //number has no charAt method
  .toString()
  .charAt(0)
  .substring(0);//<="0"

相关问题