javascript - Why cannot redefine property? - Stack Overflow

When I run the following code, I get the error:TypeError: Cannot redefine property: isBooleanWhy can�

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
Add a ment  | 

3 Answers 3

Reset to default 5

Because 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

相关推荐

  • javascript - Why cannot redefine property? - Stack Overflow

    When I run the following code, I get the error:TypeError: Cannot redefine property: isBooleanWhy can�

    8天前
    10

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信