2014-09-25 4 views
0

나중에 프로토 타입으로 사용하려고하는 개체를 만듭니다. 개체의 속성 중 하나가 배열입니다. 두 개의 객체를 프로토 타입으로 사용하여 하나의 요소를 첫 번째 배열로 밀어 넣으십시오. 두 번째 객체의 배열에 왜 나타나는지, 어떻게 수정해야합니까? 감사합니다.Object 속성 프로토 타입 개체로 배열

코드를 참조하십시오

var Category = { 

      name: "", 
     items: [], 
    totalSpent: function(){ 
     var total = 0; 
     this.items.forEach(function(item){ 
     sum += item.price; 
     }); 
    } 

    }; 

var cat1 = Object.create(Category); 
var cat2 = Object.create(Category); 

cat1.items.push("item1"); 

console.log(cat2.items);  //return ["item1"] 
+1

두 개의 서로 다른 객체의 프로토 타입과 똑같은 객체를 사용하고 있습니다. 왜 그 행동은 놀라운 일인가? 'Object.create()'호출은 전달 된 객체의 ** 복사본 **을 만들지 않습니다. – Pointy

+1

프로토 타입 상속은 데이터가 아니라 기능 공유에 관한 것입니다. 'Object.create'가 아니라 (주어진 프로토 타입을 가진 객체를 생성하는) 객체 내용을 복사하려고한다면, 그것은 데이터를 복사하는 Object.assign입니다 (ES6 임에도 불구하고). –

+0

Pointy, 클래스의 객체에 대한 인스턴스화가 동일하게 작동 할 것이라고 생각했습니다. –

답변

1

Object.create 이 객체의 전체 복사가되지 않습니다. 첫 번째 인수를 프로토 타입으로 사용하여 두 번째 인수 (또는 두 번째 인수가 제공되지 않은 경우 빈 객체)를 기반으로 한 객체를 반환합니다. 그런 다음 해당 프로토 타입의 멤버를 변형하면 프로토 타입으로 해당 개체를 사용하는 모든 인스턴스에 영향을줍니다 (범주의 경우).

cat1과 cat2 모두 카테고리가 프로토 타입이므로, 그래서 :

cat1.__proto__ === cat2.__proto__;//true 
Category === cat1.__proto__; 

당신이 프로토 타입을 포함하지 않고 무슨 일을하는지 당신에게 예를 표시하려면 (참고 : 프로토를 사용하지 않는, 그것은 비표준 속성이다) : 프로토 타입과 관련된 것들로

var org = {member:22}; 
// copy is a reference to org 
// same as cat1={};cat1.__proto__ = Category 
// or cat1 = Object.create(Category) 
var copy = org; 
// same as cat1.items.push('item'); 
// you are mutating Category.items so mutating Category 
copy.member=0;//mutating copy, so mutating org as well 
console.log(org.member);//=0 

는 얻을 다시 할당하는 멤버가 실제로 프로토 타입을 변경하는 대신 해당 멤버를 섀도 잉하지만 위의 예는 간단하기 때문에 조금 복잡합니다. 귀하의 경우에는

var proto = {member:22,other:{sub:22}}; 
var copy = Object.create(proto); 
//this does not affect proto as it will shadow the member 
copy.member=0; 
//this will affect proto because you're mutating proto.other 
copy.other.sub=0; 

items 회원은 특정 인스턴스와 프로토 타입에 정의 할 수 없습니다. 인스턴스 특정 멤버를 초기화하려면 생성자 함수 나 인스턴스를 사용하기 전에 인스턴스를 초기화하는 init 함수를 사용할 수 있습니다.

프로토 타입이 사용되는 방식, 섀도 잉 및 기타 자세한 내용은 here입니다.

관련 문제