JavaScript动态定义方法:Object.defineProperty设置方法为何返回undefined?
在JavaScript中动态定义方法的几种方式
嘿,关于动态定义方法,其实有好几种实用的方式,我给你梳理一下:
直接赋值法:这是最直观简单的方式,直接给对象的属性绑定一个函数即可:
const obj = {}; obj.myMethod = function() { console.log('Hello!'); }; obj.myMethod(); // 输出 Hello!也可以用箭头函数(注意箭头函数的
this指向和普通函数有差异):obj.myArrowMethod = () => console.log('Arrow method works!');使用
Object.defineProperty(正确姿势):你之前用这个API踩了参数格式的坑,但它其实完全支持定义方法,后面我会详细解释原因。正确的写法是把函数放到配置对象的value属性里:const obj = {}; Object.defineProperty(obj, 'myMethod', { value: function() { console.log('Hello from defineProperty!'); }, writable: true, // 可选,默认false,控制方法是否可被修改 enumerable: true, // 可选,默认false,控制方法是否能被for...in遍历到 configurable: true // 可选,默认false,控制方法是否可被删除或重新定义 }); obj.myMethod(); // 输出 Hello from defineProperty!使用
Object.assign批量定义:如果要给对象一次性添加多个方法,用这个方法效率很高:const obj = {}; Object.assign(obj, { method1: function() { console.log('Method 1'); }, method2: function() { console.log('Method 2'); } }); obj.method1(); // 输出 Method 1在原型上定义(针对构造函数/类):如果是给类的所有实例统一添加方法,可以在原型对象上定义:
function MyClass() {} MyClass.prototype.myMethod = function() { console.log('Prototype method'); }; const instance = new MyClass(); instance.myMethod(); // 输出 Prototype methodES6类的写法:
class MyClass { // 类内定义的方法默认挂载在原型上 myMethod() { console.log('Class method'); } } // 也可以动态给原型追加方法 MyClass.prototype.newMethod = function() { console.log('Dynamic prototype method'); };
为什么你的
Object.defineProperty代码得到undefined? 你写的这段代码:
var obj = {}; Object.defineProperty(obj, 'myMethod', function () { console.log('Hello!'); })
问题出在第三个参数的类型要求上!Object.defineProperty的第三个参数必须是一个配置对象,而不是直接传函数。当你把函数作为第三个参数传入时,JS会把这个函数当作配置对象来解析,但函数对象本身没有value属性(除非你手动添加),所以默认value就是undefined,最终obj.myMethod自然就是undefined。
说白了,Object.defineProperty完全支持定义函数类型的属性(也就是方法),只是你用错了参数格式。只要把函数放到配置对象的value字段里,就能正常定义方法啦,就像我上面举的正确例子那样。
内容的提问来源于stack exchange,提问作者karthikaruna
相关产品推荐
相关产品推荐

