admin管理员组文章数量:1401849
When I run the following code, I get the error:
TypeError: Cannot redefine property: isBoolean
Why can't I redefine those properties?
function isBoolean() {
var value = arguments[0];
if (!arguments.length) {return;}
if (value===undefined || value===null) { return false; }
if (typeof(value) === "boolean") {
return true;
} else {
return false;
}
}
function isString() {
var value = arguments[0];
if (!arguments.length) {return;}
if (value===undefined || value===null) { return false; }
if (typeof(value) === "string") {
return true;
} else {
return false;
}
}
function isNumber() {
var value = arguments[0];
if (!arguments.length) {return;}
if (onoff) {
if (value === Infinity) { return Infinity; }
}
if (value===undefined || value===null) { return false; }
if (typeof(value) === "number") {
return true;
} else {
return false;
}
}
function isArray() {
var value = arguments[0];
if (!arguments.length) {return;}
return Array.isArray(value);
}
Object.defineProperties(window, {
// "thisType" : { enumerable: false },
"isBoolean": { enumerable: false },
"isString" : { enumerable: false },
"isNumber" : { enumerable: false },
"isArray" : { enumerable: false },
});
When I run the following code, I get the error:
TypeError: Cannot redefine property: isBoolean
Why can't I redefine those properties?
function isBoolean() {
var value = arguments[0];
if (!arguments.length) {return;}
if (value===undefined || value===null) { return false; }
if (typeof(value) === "boolean") {
return true;
} else {
return false;
}
}
function isString() {
var value = arguments[0];
if (!arguments.length) {return;}
if (value===undefined || value===null) { return false; }
if (typeof(value) === "string") {
return true;
} else {
return false;
}
}
function isNumber() {
var value = arguments[0];
if (!arguments.length) {return;}
if (onoff) {
if (value === Infinity) { return Infinity; }
}
if (value===undefined || value===null) { return false; }
if (typeof(value) === "number") {
return true;
} else {
return false;
}
}
function isArray() {
var value = arguments[0];
if (!arguments.length) {return;}
return Array.isArray(value);
}
Object.defineProperties(window, {
// "thisType" : { enumerable: false },
"isBoolean": { enumerable: false },
"isString" : { enumerable: false },
"isNumber" : { enumerable: false },
"isArray" : { enumerable: false },
});
Share
Improve this question
edited May 18, 2017 at 16:55
T.J. Crowder
1.1m200 gold badges2k silver badges1.9k bronze badges
asked May 18, 2017 at 16:07
DaiDai
211 gold badge1 silver badge1 bronze badge
3
- 2 Post all code here directly as text. Never link to code, and certainly never link to pictures of code. – Carcigenicate Commented May 18, 2017 at 16:09
- 3 Please post your code, not a link to a picture of it. – Bergi Commented May 18, 2017 at 16:09
- 2 Please see How do I ask a good question and How to create a Minimal, Complete, and Verifiable example – Nope Commented May 18, 2017 at 16:09
3 Answers
Reset to default 5Because a global function declaration creates a binding on the global object (the window, on browsers) whose configurable
flag is false
. This is covered in GlobalDeclarationInstantiation, which uses CreateGlobalVarBinding to create the binding for the function, passing false
as the D
flag, which is used for the configurable
flag. (It's in Step 18.a, function names are part of the declaredVarNames
, which e from varDeclarations
, which are retrieved via VarScopedDeclarations, which includes HoistableDeclarations, one of which is FunctionDeclaration.)
Since the binding isn't configurable, you can't change its enumerable
flag from true
to false
.
The problem is that when you declare a function on the global scope, it already places it on the window
object with the configurable flag equal to false. One way to avoid this is to define the functions inside of another function (an IIFE works great) like so:
You also should be setting the value
property of the props
object inside Object.defineProperties()
, otherwise the value defaults to undefined
as per the docs.
(function () {
'use strict';
function isBoolean() {
var value = arguments[0];
if (!arguments.length) {return;}
if (value===undefined || value===null) { return false; }
if (typeof(value) === "boolean") {
return true;
} else {
return false;
}
}
function isString() {
var value = arguments[0];
if (!arguments.length) {return;}
if (value===undefined || value===null) { return false; }
if (typeof(value) === "string") {
return true;
} else {
return false;
}
}
function isNumber() {
var value = arguments[0];
if (!arguments.length) {return;}
if (onoff) {
if (value === Infinity) { return Infinity; }
}
if (value===undefined || value===null) { return false; }
if (typeof(value) === "number") {
return true;
} else {
return false;
}
}
function isArray() {
var value = arguments[0];
if (!arguments.length) {return;}
return Array.isArray(value);
}
Object.defineProperties(window, {
"isBoolean": { enumerable: false, value: isBoolean },
"isString" : { enumerable: false, value: isString },
"isNumber" : { enumerable: false, value: isNumber },
"isArray" : { enumerable: false, value: isArray },
});
})();
Since you put the ecmascript-6
tag in your question, may I suggest you to use let
or const
with function expressions? Contrary to a function statement/declaration (which roughly behaves like var
), global variables/constants declared with let
/const
do not bee properties of the global object (here window
).
const isBoolean = function () {
var value = arguments[0];
if (!arguments.length) {return;}
if (value===undefined || value===null) { return false; }
if (typeof(value) === "boolean") {
return true;
} else {
return false;
}
};
const isString = function () {
var value = arguments[0];
if (!arguments.length) {return;}
if (value===undefined || value===null) { return false; }
if (typeof(value) === "string") {
return true;
} else {
return false;
}
};
const isNumber = function () {
var value = arguments[0];
if (!arguments.length) {return;}
if (onoff) {
if (value === Infinity) { return Infinity; }
}
if (value===undefined || value===null) { return false; }
if (typeof(value) === "number") {
return true;
} else {
return false;
}
};
const isArray = function () {
var value = arguments[0];
if (!arguments.length) {return;}
return Array.isArray(value);
};
console.log('"window" properties before "defineProperties":');
console.log('isBoolean: ' + ("isBoolean" in window));
console.log('isString: ' + ("isString" in window));
console.log('isNumber: ' + ("isNumber" in window));
console.log('isArray: ' + ("isArray" in window));
Object.defineProperties(window, {
"isBoolean": { enumerable: false },
"isString" : { enumerable: false },
"isNumber" : { enumerable: false },
"isArray" : { enumerable: false },
});
console.log('"window" properties after "defineProperties":');
console.log('isBoolean: ' + ("isBoolean" in window));
console.log('isString: ' + ("isString" in window));
console.log('isNumber: ' + ("isNumber" in window));
console.log('isArray: ' + ("isArray" in window));
本文标签: javascriptWhy cannot redefine propertyStack Overflow
版权声明:本文标题:javascript - Why cannot redefine property? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744255630a2597468.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论