通过自定义函数隐藏覆盖本机函数的`prototype`属性

时间:2019-07-08 17:10:36

标签: javascript

由js函数自定义的本机方法

console.log = function myLog(args){...}

或使用Object.definePropery(...) 然后

'prototype' in console.log == true

是否有一种隐藏prototype键的方式,使其更像本机功能?

如此

'prototype' in console.log == false

2 个答案:

答案 0 :(得分:2)

您可以删除属性:

console.log = function myLog(args){…};
delete console.log.prototype;

或者,通过不使用函数表达式来创建最初没有.prototype的函数:

console.log = {log(args) {…}}.log;

console.log = (args) => {…};

答案 1 :(得分:-1)

GetOffMyLawn是正确的。对象原型被冻结

> Object
[Function: Object]
> Object.prototype
{}
> Object.prototype = null;
null
> Object.prototype
{}

就像功能一样

> Function instanceof Object
true
> Function.prototype
[Function]
> Function.prototype = null;
null
> Function.prototype
[Function]

为了重新分配原型,您需要实例化自己的Object。我认为默认情况下,新对象将不具有任何冻结属性,包括原型。

> function Test() {}
undefined
> const test = new Test();
undefined
> test
Test {}
> test.prototype
undefined
> test.prototype = null
null
> test instanceof Function
false
> test instanceof Object
true
> test instanceof Test
true
> test.prototype
null
> Object.prototype = test.prototype
null
> Object.prototype
{}
> Object.prototype.whoo = 'whoo';
'whoo'
> Object.prototype
{ whoo: 'whoo' }
> test.prototype = Object.prototype
{ whoo: 'whoo' }
> test.prototype
{ whoo: 'whoo' }

根据设计,Object.prototype不可写,不可枚举或不可配置(冻结)。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype