代码组(3) 属性

虽然会有这样的错误,但是如果再仔细测试一下,会发现input标type属性设为button时,还是具有checked属性的,而且默认为false
代码如下所示: 复制代码 代码如下:

布尔型合并对象如下代码:

代码组(3) 属性

代码组可以具有一些属性,这些属性可影响公共语言运行库确定程序集允许的权限集的方式。可应用到代码组的属性有两种:Exclusive和LevelFinal。

Exclusive属性,策略级别允许的权限集是与具有此属性的代码组关联的权限集。在考虑所有策略级别时,运行库向代码授予的权限绝对不会多于与Exclusive代码组关联的权限。在给定的策略级别内,代码只能是具有Exclusive属性的一个代码组的成员。在运行库计算独占代码组中的程序集的权限时,该属性会防止考虑同一策略级别中的其他代码组。但仍会计算当前级别之下和之下的策略级别。该属性允许一个特定代码组为当前策略级别针对向与该组匹配的程序集授予什么权限的问题做出唯一决定。这在需要向特定程序集授予特定权限集而不允许来自同一策略级别上的其他代码组匹配项的权限时很有用。

注意:如果一个程序集属于多个标记为独占的代码组,则不允许执行该程序集。

LevelFinal属性,在检查代码组成员和授予权限时,不会考虑包含此代码组的策略级别以下的、应用程序域级别之外的其他任何策略级别。企业级策略是策略的最高级别,接着是计算机策略、用户策略,然后是应用程序域策略。例如,如果LevelFinal属性应用到企业级策略中的代码组,且某代码与此代码组的成员条件匹配,那么,计算机级别策略和用户级别策略不会应用到该代码。应用
LevelFinal属性可以保证,与标有该属性的代码组关联的程序集绝对不会因为较低策略级别管理员做出的决定而收到较少的权限。

可以用.NET Framework配置工具或者是代码访问安全策略工具针对代码组开启或关闭Exclusive(或LevelFinal)属性。开启代码组Exclusive属性的方法如下:

caspol -chggroup 1.2.1. -exclusive on

其中,使用chggroup命令更改标签为1.2.1的代码组,把Exclusive属性设置为开状态。

———————注:本文部分内容改变自《.NET 安全揭秘》

然后直接判断类型,返回的是object类型

var target = {a: 0};
var source1 = {b: 1};
var source2 = {c: 2};

Object.assign(target, source1, source2);
console.log(target);  // 输出 {a: 0, b: 1, c: 2}
var obj = {a: 1};
console.log(Object.assign(obj, null) === obj); // true
console.log(obj); // {a: 1}

var obj = {a: 1};
console.log(Object.assign(obj, undefined) === obj); // true
console.log(obj); // {a: 1}

上面代码可以看到原始值都在包装对象的内部属性[[PrimitiveValue]]上,这个属性没有被Object.assign合并,只有字符串的包装对象会产生可枚举的属性,属性则会被合并。
但是Object.assign合并的属性是有限的,只合并对象的自身的属性(不合并继承属性),也不合并不可枚举的属性。

var obj = {a: 1};
console.log(Object.assign(obj, 12) === obj); // true
console.log(obj); // {a: 1}

ES6中Object.assign() 方法

function clone(obj) {
   return Object.assign({}, obj);
}
console.log(typeof Object.assign(2)) // object

   3-2 为对象添加方法

字符串合并对象如下代码:

如上代码,目标对象有1,2,3属性,源对象有4,5值,如果使用Object.assign的话,那么源对象的键4,5
和目标对象的1,2键是相同的,因此值直接替换掉。

console.log(Object('bcd')); // {0: "b", 1: "c", 2: "d", length: 3, [[PrimitiveValue]]: "bcd"}
console.log(Object(1111)); // {[[PrimitiveValue]]: 1111}
console.log(Object(true)); // {[[PrimitiveValue]]: true}
function typeOf(obj) {
  const toString = Object.prototype.toString;
  const map = {
    '[object Boolean]': 'boolean',
    '[object Number]': 'number',
    '[object String]': 'string',
    '[object Function]': 'function',
    '[object Array]': 'array',
    '[object Date]': 'date',
    '[object RegExp]': 'regExp',
    '[object Undefined]': 'undefined',
    '[object Null]': 'null',
    '[object Object]': 'object'
  };
  return map[toString.call(obj)];
}
function deepCopy(data) {
  const t = this.typeOf(data);
  let o,
    i;
  if (t === 'array') {
    o = [];
  } else if (t === 'object') {
    o = {};
  } else {
    return data;
  }
  if (t === 'array') {
    for (let i = 0; i < data.length; i++) {
      o.push(this.deepCopy(data[i]));
    }
  } else if (t === 'object') {
    for (i in data) {
      o[i] = this.deepCopy(data[i]);
    }
  }
  return o;
}

如上面的代码,在JS中,我们使用递归的方式,循环遍历对象的所有属性和方法,实现深度克隆,因此当我们深度克隆到新对象中的时候,再去更改源对象的属性值的时候,不会影响到新对象。

class A {
  constructor(x, y) {
    Object.assign(this, {x, y});
  }
}

但是如果源对象和目标对象有同名属性的话,那么Object.assign会直接替换该属性。比如如下代码:

Copyright @ 2015-2020 ca88 版权所有
网站地图xml地图