2014-01-21 1 views
1

아래의 바이올린/코드를 참조하십시오 http://jsfiddle.net/kmiklas/3YdTA/4/JavaScript Prototypal Inheritance : 자식의 getter/setter 호출이 부모에게 영향을주는 이유는 무엇입니까?

질문 :

아이의 setter 함수를 호출하지 왜
  • - 예에서, 전화를 Object.create(99)로 설정 --change 부모님? 우리가 오렌지의 컨텍스트에서이 함수를 호출 했음에도 불구하고 빨간색의 값을 변경하는 방법에 유의하십시오.
  • 더 중요한 것은 상속 된 getter/setter 함수를 부모가 아닌 자식에게 어떻게 적용 할 수 있습니까?
  • 여기에 무엇이 누락 되었습니까?

var Square = function() { 
    var side; 
    this.setSide = function(s) { 
     side = s 
    } 
    this.getSide = function() { 
     return side; 
    } 
} 
var red = new Square(); 
var orange = Object.create(red); 
red.setSide(100); 
var $container = $('#container'); 
$container.append('orange.getSide(): ' + orange.getSide() + '<br>'); 
$container.append('red.getSide(): ' + red.getSide() + '</br><br>'); 
$container.append('<i>Now we call orange.setSide(99)...</i><br></br>'); 
orange.setSide(99); 
$container.append('orange.getSide(): ' + orange.getSide() + ' <i>...as expected.<br></i>'); 
$container.append('red.getSide(): ' + red.getSide() + '!? <i>Why does the call to orange.setSide(99) affect the side length of the parent?</i></br>'); 
+3

에서이 참조 게시 한 코드와 관련이 있습니다. ... 그 코드에는 상속이 없습니다. –

+0

당신은 바이올린을 봐야합니다 ... 당신은 오프 토픽으로 이것을 투표 했습니까? 그렇지 않습니다. 보류 상태를 제거하십시오. – kmiklas

+3

질문에 직접 문제를 재현하는 데 필요한 모든 관련 정보를 입력해야합니다. 나는 주제에서 투표하지 않았다. 중재자가했습니다. –

답변

1

The Object.create() method creates a new object with the specified prototype object and properties.

MDN

var orange = Object.create(red); 

당신은, 당신이 그것에 원본에 미친 그래서 모든 변경 사항을 새로운 심판을 만드는이 방법으로 개체를 복제하지 않습니다 개체가이 개체에 대한 모든 복사본에 적용됩니다.

var x = {name:"foo",phone:"bar"}; 
var y = Object.create(x); 

x.u = "123"; 

console.log(y);//{name: "foo", phone: "bar", u: "123"} 
console.log(x);//{name: "foo", phone: "bar", u: "123"} 

객체는 자바 스크립트에 Ref에 의해 복사됩니다

DEMO

내가 무엇을`Object.create (99)`,`orange`와`red`을 이해하지 못하는 How do I correctly clone a JavaScript object?

+0

아주 좋은 ... 고마워! – kmiklas

+0

아주 좋은 질문이었습니다. –

관련 문제