프로토 타입에 있는 값을 객체 인스턴스에서 읽어올 수는 있지만 수정은 불가능하다. 


<delete> http://jsbin.com/saxesu/5/edit

delete instance.property 하면 그 객체의 프로토타입. property에 덧씌운 값이 사라진다.  delete를 하지 않으면 원래 프로토타입의 값을 다시 찾을 수 없다. 

프로토타입에서 설정한 내용은 객체의 프로퍼티에 직접 값을 넣어 수정할 수 있다.

그러나 한번 프로퍼티를 만들고 나면 그 값을 본디 프로토타입 에서 찾아올 수 없다. 그래서 새로 부여한 프로퍼티를 없애려면 delete instance.property;를 해줘야 한다.


<hasOwnProperty()>


1 function Person() { 2 3 } 4 5 Person.prototype.name = "dayoungle"; 6 Person.prototype.age = 12; 7 Person.prototype.job = "software engineer"; 8 Person.prototype.sayName = function() { 9 alert(this.name); 10 }; 11 12 var person1 = new Person(); 13 var person2 = new Person(); 14 15 person1.name = "gd"; 16 //person1.sayName(); 17 //person2.sayName(); 18 19 delete person1.name; 20 21 alert(person1.hasOwnProperty("name")); 22 //프로토 타입 위에 덧씌우는 순간, 인스턴스의 프로퍼티. 23 person1.name = "dg"; 24 

25 alert(person1.hasOwnProperty("name"))


hasOwnProperty("property_name")하면 객체에 이러한 이름의 프로퍼티가 할당되어 있는지를 확인한다.  객체에 해당하는 프로퍼티 이름이 있는지를 확인해서 boolean값을 반환한다. 


<in >

"propertyname" in instance;하면 객체나 프로토타입 어디에든 이 이름이 있을 때 true를 반환한다. 만약 hasOwnProperty("propertyName");에서 false가 나왔는데, in을 사용했을 때 true가 나온다면 프로토타입에는 해당하는 항목이 있다는 의미가 된다. 


1 function Person() { 2 3 } 4 5 Person.prototype.name = "dayoungle"; 6 Person.prototype.age = 12; 7 Person.prototype.jpb = "software engineer"; 8 Person.prototype.sayName = function() { 9 alert(this.name); 10 }; 11 12 var person1 = new Person(); 13 var person2 = new Person(); 14 15 person1.name = "gd"; 16 //person1.sayName(); 17 //person2.sayName(); 18 19 delete person1.name; 20 21 //alert(person1.hasOwnProperty("name")); 22 //프로토 타입 위에 덧씌우는 순간, 인스턴스의 프로퍼티. 23 person1.name = "dg"; 24 25 //alert(person1.hasOwnProperty("name")); 26 //alert(person1.name); 27 28 alert(person1.hasOwnProperty("name"));//true 29 alert("name" in person1);//true 30 31 alert(person2.hasOwnProperty("name"));//false

 32 alert("name" in person2);//true



<in 2>

for-in 을 사용하면 instance의 property만 검색한다. 따라서 프로토타입의 프로퍼티는 나오지 않음. 이것을 예방하기 위해서 Objects.keys("constructor.prototype")을 쓴다. 그러나 이것은 instance의 property는 나오지 않는다. 반면, Objects.keys(instance)를 하면 프로토타입의 프로퍼티는 나오지 않는다. 이를 예방하기 위해서 Object.getOwnPropertyNames(constructor.prototype)하면 생성자까지 다 나온다.  


  1 for(var prop in o){
  2   if(prop = toString){
  3     alert("found");
  4   }
  5 }
  6 
  7 var keys = Object.keys (Person.prototype);
  8 alert(keys);
  9 
 10 var p1keys = Object.keys(person1);
 11 alert(p1keys);//이렇게 하면 새로 설정한 인스턴스 프로퍼티만 나옴.
 12 
 13  alert(Object.getOwnPropertyNames(Person.prototype));




저작자 표시 비영리 변경 금지
신고

'JS' 카테고리의 다른 글

프로토타입 정리  (0) 2014.08.05

+ Recent posts

티스토리 툴바