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));
发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744255631a4565386.html
评论列表(0条)