Aprendizaje basado en JavaScript - y valores de propiedades de blindaje

Aprendizaje basado en JavaScript - y valores de propiedades de blindaje

Propiedad del objeto
  • Modificar las propiedades del objeto en sí
  var myObject = { a: 2 };
  myObject.a = 3;
  console.log(myObject); // {a: 3}

  • Si A no es una presencia directa en myObject, [[el Prototype]] de la cadena será atravesada, si no se encuentra en la cadena original, que se añadirá directamente a un myObject
    myObject.b =. 3, b no se encuentra en la myObject, a mirada en otroObjeto, no puede encontrar, objeto de objetos se ha encontrado, no encontró b, b anuncios Quiero directamente en la myObject
  var anotherObject = { a: 2 };
  var myObject = Object.create(anotherObject);
  myObject.b = 3;
  console.log(myObject); // {b: 3}
escudo

[[El Prototype]] Si la cadena superior aparece en un nombre de atributo myObject, también es la de ocurrirá el escudo.
myObject contiene una propiedad de blindaje de un prototipo de todas las propiedades de la cadena superior.

  var anotherObject = { a: 2 };
  var myObject = Object.create(anotherObject);
  Object.defineProperty(myObject, 'a', { value: 3, writable: true });
  console.log(myObject); // {a: 3}
  console.log(anotherObject); // {a: 2}
  myObject.a = 4;
  console.log(anotherObject); // {a: 2}
  console.log(myObject); // {a: 4}

Si no está presente en un myObject, presente en el otroObjeto, myObject.a = 3, habrá tres casos especiales

  1. Si [[el Prototype]] la presencia de una cadena superior, y no leer (escribible: true), a continuación, añadido en un atributo denominado un myObject, son las propiedades de blindaje.
  var anotherObject = { a: 2 };

  var myObject = Object.create(anotherObject);
  console.log(myObject.a); // 2

  myObject.a = 3;
  console.log(myObject.a); // 3
  console.log(myObject); // {a: 3}
  console.log(anotherObject); // {a: 2}
  1. Si [[el Prototype]] la presencia de la parte superior hebra a, pero de sólo lectura (escribible: falso), no puede ser añadido a la myObject a. Si el error en modo estricto. Pero se puede definir en un definePrototype.
  // 'use strict'; // Uncaught TypeError: Cannot assign to read only property 'a' of object '#<Object>'
  var anotherObject = {};
  Object.defineProperties(anotherObject, {
    a: {
      writable: false,
      value: 2
    }
  });

  var myObject = Object.create(anotherObject);
  console.log(myObject.a); // 2
  myObject.a = 3;
  console.log(myObject.a); // 2
  console.log(myObject); // {}
  console.log(anotherObject); // {a: 2}

  Object.defineProperty(myObject, 'a', { value: 3 });
  console.log(myObject); // {a: 3}
  myObject.a = 4;
  console.log(myObject); // {a: 4}
  1. Si en un [[Prototype]] es un pionero de la parte superior, no se añade a la myObect, no va a redefinir el organismo, pero llamar a este colocador
  var anotherObject = {
    get a() {
      return this._a_;
    },
    set a(val) {
      this._a_ = val;
    }
  };

  var myObject = Object.create(anotherObject);
  console.log(myObject); // {}
  myObject.a = 3;
  console.log(myObject); // {_a_: 3}

escudo implícita

  var anotherObject = { a: 2 };
  var myObject = Object.create(anotherObject);

  console.log(anotherObject.a); // 2
  console.log(myObject.a); // 2

  // 相当于 myObject = myObject.a + 1
  myObject.a++;

  console.log(anotherObject.a); // 2
  console.log(myObject.a); // 3
Publicado 83 artículos originales · ganado elogios 21 · Vistas a 50000 +

Supongo que te gusta

Origin blog.csdn.net/JsongNeu/article/details/95759290
Recomendado
Clasificación