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입니다.
출처
2014-09-26 01:36:16
HMR
두 개의 서로 다른 객체의 프로토 타입과 똑같은 객체를 사용하고 있습니다. 왜 그 행동은 놀라운 일인가? 'Object.create()'호출은 전달 된 객체의 ** 복사본 **을 만들지 않습니다. – Pointy
프로토 타입 상속은 데이터가 아니라 기능 공유에 관한 것입니다. 'Object.create'가 아니라 (주어진 프로토 타입을 가진 객체를 생성하는) 객체 내용을 복사하려고한다면, 그것은 데이터를 복사하는 Object.assign입니다 (ES6 임에도 불구하고). –
Pointy, 클래스의 객체에 대한 인스턴스화가 동일하게 작동 할 것이라고 생각했습니다. –