>  기사  >  웹 프론트엔드  >  JS 객체 속성 관련(속성 확인, 열거 속성 등)_javascript 기술

JS 객체 속성 관련(속성 확인, 열거 속성 등)_javascript 기술

WBOY
WBOY원래의
2016-05-16 16:05:531407검색

1. 속성 삭제

삭제 연산자는 객체의 속성을 삭제할 수 있습니다

코드 복사 코드는 다음과 같습니다.

delete person.age //즉, person은 더 이상 age 속성을 갖지 않습니다
사람['나이'] //또는 이
삭제

삭제는 호스트 개체에서 속성의 연결을 끊을 뿐, 속성의 속성을 작동하지는 않습니다. a.p를 삭제한 후에도 b.x는 여전히 1입니다

var a = {p:{x:1}};
var b = a.p;
console.log(a.p.x); //1
delete a.p;
console.log(a.p.x); //TypeError a.p is undefined
console.log(a.p); //undefined
console.log(b.x); //1

delete는 상속된 속성이 아닌 자신의 속성만 삭제할 수 있습니다. (상속된 속성을 삭제하려면 이 속성을 정의하는 프로토타입 객체에서 삭제해야 합니다. 물론 이는 이 프로토타입에서 상속하는 모든 객체에 영향을 미칩니다.)

function inherit(p){ 
  if(p == null){  // 不能从null中继承
    throw TypeError();
  }
  if(Object.create){  //如果有这个方法就直接使用
    return Object.create(p);
  }
  var t = typeof p;
  if(t !== "object" || t !== "function"){  //要继承的对象 类型要符合
    throw TypeError();
  }
  function f(){ }; //定义一个空的构造函数
  f.prototype = p; //原型指向要继承的对象p
  return new f();  //创建f对象,此对象继承自p
}

var obj = {x:1};
var obj1 = inherit(obj);
obj1.y = 2;
console.log("x = "+obj1.x+" y = "+obj1.y); //x = 1 y = 2
delete obj1.x;
delete obj1.y;
console.log("x = "+obj1.x+" y = "+obj1.y); //x = 1 y = undefined

물론 삭제는 구성 가능한 속성에만 사용할 수 있습니다
예를 들어

delete Object.prototype; // 不能删除 不可配置

var x = 1;
delete this.x; //不能删除
this.y = 1;
delete y; //这样可以删除

function f(){ }
delete this.f; //不能删除

2. 속성 감지

'in'을 사용하세요

in 연산자는 왼쪽 피연산자가 문자열이거나 문자열로 변환 가능하고 오른쪽 피연산자가 객체

일 것으로 예상합니다.
var data = [5,6,7];
console.log("0" in data); //有下标0
console.log(1 in data);  //1可以转换成"1"
console.log("4" in data); //下标只有 1 2 3
 
var obj = {x:1};
console.log("x" in obj); //true
console.log("y" in obj); //false
console.log("toString" in obj); //true 因为obj继承了这个方法

hasOwnProperty() 또는 propertyIsEnumerable()을 사용하세요. --- 후자는 전자의 향상된 기능입니다.
구민시는 생각했다

var obj = {x:1};
console.log(obj.hasOwnProperty("x")); //true
console.log(obj.hasOwnProperty("y")); //false
console.log(obj.hasOwnProperty("toString")); //false 因为obj继承了这个方法,但不是它自己的

자유 속성과 열거 가능 속성이 감지된 경우에만 후자가 true를 반환합니다

var obj = {x:1};
console.log(obj.propertyIsEnumerable("x")); //true
console.log(obj.propertyIsEnumerable("y")); //false
console.log(obj.propertyIsEnumerable("toString")); //false 因为obj继承了这个方法,但不是它自己的
console.log(Object.prototype.propertyIsEnumerable("toString")); //false 因为最原始的的 toString就是不可枚举的

물론 "!==" 연산자를 직접 사용하여

var obj = {x:1};
console.log(obj.x !== undefined);//true
console.log(obj.y !== undefined);//false
console.log(obj.toString !== undefined); //true 

3. 열거 속성

var obj = {x:1,y:2};
for(p in obj){
 console.log(p);//x y
 console.log(obj.p);// undefined undefined
 console.log(obj[p]);//1 2
} 

확장 1:

각 객체에는 연관된 프로토타입, 클래스 및 확장성이 있습니다
객체가 다른 객체의 프로토타입인지(또는 프로토타입 체인에 있는지) 확인하려면 isPrototypeOf() 메서드를 사용할 수 있습니다.

var p = {x:1}; //p原型对象继承自Object.prototype
var o = Object.create(p); //o对象继承自p

console.log(p.isPrototypeOf(o));//true
console.log(Object.prototype.isPrototypeOf(o));//true
console.log(Object.prototype.isPrototypeOf(p));//true

물론 isPrototypeOf() 메소드는 instanceof 연산자와 매우 유사합니다
instanceof 연산자는 왼쪽 피연산자가 객체이고 오른쪽 피연산자가 객체의 클래스를 식별할 것으로 예상합니다. 왼쪽 객체가 오른쪽 클래스의 인스턴스이면 표현식은 true를 반환하고, 그렇지 않으면 false를 반환합니다

var p = {x:1}; 
console.log(p instanceof Object);//true

var d = new Date();
console.log(d instanceof Date);//true
console.log(d instanceof Object);//true
console.log(d instanceof Number);//false

확장 2:

객체의 class 속성은 객체의 타입 정보를 나타내는 문자열입니다

일반적으로 toString() 메소드를 호출한 후 [객체 클래스] 형식을 반환합니다

예를 들어

코드 복사 코드는 다음과 같습니다.

var obj = {x:1,y:2};
console.log(obj.toString());//[객체 객체]

따라서 객체의 클래스를 가져오려면 반환된 문자열에서 "class" 필드를 찾아 슬라이스 (8, -1)를 사용하면 됩니다.
예를 들어

function classOf(obj){ // 找出类名
 if(obj === null){
  return "Null";
 }
 if(obj === undefined){
  return "Undefined";
 }
 return Object.prototype.toString.call(obj).slice(8,-1);
}

console.log(classOf(1)); //Number
//注意,实际上是这些类型的变量调用toString()方法,而不是通过他们自身直接调用
//console.log(1.toString()); //会报错
var a = 1;
console.log(Number(1).toString()); //1
console.log(a.toString()); //1
console.log({x:1}.toString()); //[object Object]

console.log(classOf(1)); //Number
console.log(classOf("")); //String
console.log(classOf("str")); //String
console.log(classOf(null)); //Null
console.log(classOf(false)); //Boolean
console.log(classOf({})); //Object
console.log(classOf([])); //Array
console.log(classOf(new Date())); //Date
function f(){}
console.log(classOf(new f())); //Object
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.