如何在JavaScript中创建自定义方法

如何在JavaScript中创建自定义方法,javascript,prototype,Javascript,Prototype,我希望在JavaScript中有我自己的方法,可以访问前面的方法/函数的某些属性 例如: 这将提醒arr的长度。 但是我想使用我的自定义方法,而不是length方法,比如len 例如: 您可以为内置对象创建自定义方法或属性,在您给出的示例中,您希望更改数组内置对象,并且必须是特定的。例如: Array.prototype.len = function() { return this.length; }; [1, 2, 3].len(); // this will return 3 请记住,此

我希望在JavaScript中有我自己的方法,可以访问前面的方法/函数的某些属性 例如:

这将提醒arr的长度。 但是我想使用我的自定义方法,而不是length方法,比如len 例如:


您可以为
内置对象
创建自定义方法或属性,在您给出的示例中,您希望更改
数组
内置对象,并且必须是特定的。例如:

Array.prototype.len = function() { return this.length; };

[1, 2, 3].len(); // this will return 3

请记住,
指的是调用该方法的数组,如果使用ES6 arrow函数,则作用域将受到影响,因此
值也会受到影响。

您可以为
内置对象创建自定义方法或属性,在您给出的示例中,您需要更改
数组
内置对象,并且必须是特定的。例如:

Array.prototype.len = function() { return this.length; };

[1, 2, 3].len(); // this will return 3

请记住,
指的是调用该方法的数组,如果使用ES6 arrow函数,范围将受到影响,因此
值也会受到影响。

您可以这样做:

Array.prototype.len = function () {
  return this.length;
};

但是有一个更好的选择,请参见下面的评论。

您可以这样做:

Array.prototype.len = function () {
  return this.length;
};

但是有一个更好的选择,请参见下面的评论。

您可以为原型定义自己的方法:

// also you may use Object.defineProperty
Array.prototype.len = function() {
   return this.length // --> this will be an array
}
然后调用函数

[1, 2, 3].len()
但是

在内置原型中定义任何新函数都是一种不好的做法-您可能会意外地重新定义现有方法,或者将来会添加具有相同名称的方法,这将导致不可预测的行为

更好的方法是创建自己的原型并使用它

function MyArray () {
// your code
}

MyArray.prototype = Object.create(Array.prototype) // inheritance 

MyArray.prototype.len = function () {
    return this.length
}
或者只需创建简单函数并将数组作为参数传递给它或作为
this

function len() {
    return this.len
}

// invoking function
len.call(array)
作为论据:

function len (array) {
    return array.len
}
作为

function len() {
    return this.len
}

// invoking function
len.call(array)

您可以为原型定义自己的方法:

// also you may use Object.defineProperty
Array.prototype.len = function() {
   return this.length // --> this will be an array
}
然后调用函数

[1, 2, 3].len()
但是

在内置原型中定义任何新函数都是一种不好的做法-您可能会意外地重新定义现有方法,或者将来会添加具有相同名称的方法,这将导致不可预测的行为

更好的方法是创建自己的原型并使用它

function MyArray () {
// your code
}

MyArray.prototype = Object.create(Array.prototype) // inheritance 

MyArray.prototype.len = function () {
    return this.length
}
或者只需创建简单函数并将数组作为参数传递给它或作为
this

function len() {
    return this.len
}

// invoking function
len.call(array)
作为论据:

function len (array) {
    return array.len
}
作为

function len() {
    return this.len
}

// invoking function
len.call(array)
要在不使用ES6类语法的情况下定义“getter”,可以使用
Object.defineProperty

Object.defineProperty(Array.prototype, 'len', {
    get: function() {
        return this.length;
    }
});
使用
.defineProperty
将(默认情况下)创建一个不可枚举的属性,以确保新属性不会无意中出现在的
结果中。。在…
循环中

将这样的属性添加到内置类是否合适的问题是一个有争议的问题。有些语言明确鼓励,有些则不鼓励。

要定义“getter”,而不使用ES6类语法,您可以使用
对象。defineProperty

Object.defineProperty(Array.prototype, 'len', {
    get: function() {
        return this.length;
    }
});
使用
.defineProperty
将(默认情况下)创建一个不可枚举的属性,以确保新属性不会无意中出现在的
结果中。。在…
循环中



将这样的属性添加到内置类是否合适的问题是一个有争议的问题。有些语言明确鼓励,有些则不鼓励。

这不是一个方法,而是一个属性。不,是一个getter/setter。看看definePropertyRelated:那不是一个方法,而是一个属性。不,是一个getter/setter。看看definePropertyRelated:你可以,但你不应该。使用
Object.defineProperty(Array.prototype,'len',{…})
。@Alnitak好的,很好。在reader,在下面的文章中,“描述”部分解释了为什么您可能不应该遵循我的建议(虽然它本身并不坏,但取决于用例):。使用
Object.defineProperty(Array.prototype,'len',{…})
。@Alnitak好的,很好。在reader,在下面的文章中,“描述”部分解释了为什么您可能不应该遵循我的建议(虽然它本身并不坏,但取决于用例):@leaf这样做是错误的-您定义了一个必须使用函数调用语法调用的方法,不是在访问属性时自动调用指定函数的getter。我知道我错了,我知道我定义了一个方法而不是getter:-D我更新了我的答案以避免误导读者。谢谢@Alnitak。。。你的答案正是我想要的。其他人只是忙着让我使用函数,而不是像你那样使用属性/方法。非常感谢每一位花时间帮助我们的人me@leaf这是错误的做法-您定义了一个必须使用函数调用语法调用的方法,而不是在访问属性时自动调用指定函数的getter。我知道我错了,我知道我定义了一个方法而不是一个getter:-D我已经更新了我的答案以避免误导读者。谢谢@Alnitak。。。你的答案正是我想要的。其他人只是忙着让我使用函数,而不是像你那样使用属性/方法。非常感谢所有花了h(is/er)时间帮助我的人。OP似乎想要一个getter,而不是一个方法。@Alnitak,嗯,可能是。在问题中,我看到了
方法
。但在内置原型中添加任何东西仍然是个坏主意:-@Alnitak也许你确实有点过度解释了,而且在我看来,定制内置原型,即使带有属性伪装,也并不总是坏事,这取决于用例。@leaf请看OP对我答案的评论-他确实想要一个getter,而不是一个方法。和FWIW,我经常在内置类中放入新方法。OP似乎需要一个getter,而不是一个方法。@Alnitak,嗯,m