: 보너스
. 우리는 위의 코드에서 보듯이
// in firefox firebug running
// an empty page
var Definition = {
name : 'Test1'
};
//doesn't matter where it's defined
Definition.greet=function() {
console.log(this);//<-what is this in Chrome?
};
Definition.arr=[];
// instance of Test1
var test1 = Object.create(Definition);
var test2 = Object.create(Definition);
console.log(test1.greet===test2.greet);//true
delete test2.greet
delete test2.greet
delete test2.greet
delete test2.greet//can't delete it
test2.greet();
console.log(test1.greet===test2.greet);//true
console.log(test1.arr===test2.arr);//true
test1.arr.push(1);
console.log(test2.arr);//=[1]
var things=[];
for(thing in test1){
things.push(thing);
}
console.log("all things in test1:",things);
things=[];
for(thing in test1){
if(test1.hasOwnProperty(thing)){
things.push(thing);
}
}
console.log("instance things in test1:",things);//nothing, no instance variables
[업데이트]
는 Object.create는 인스턴스 멤버이기로의 프로토 타입과 두 번째 매개 변수에 첫 번째 매개 변수의 모든 구성원이있는 개체를 반환 . (대답은 mccainz가 댓글에 오랫동안 포함되어있었습니다) 추가 된 이점 (IE8 및 수년간 업데이트되지 않은 브라우저를 무시함)은 인스턴스 멤버에서 열거 가능하고 쓰기 가능하며 구성 가능하도록 지정할 수 있으며 getters 및 setters를 만들 수 있다는 점이 다릅니다. 할당 (instance.someprop = 22는 실제로 instance.someprop (22) 일 수 있음)처럼 작동합니다.
인스턴스 특정 멤버를 지정하려면 몇 가지 패턴을 사용할 수 있습니다. 인수는 이러한 패턴을 사용할 때 코드가 "못생긴"것처럼 보이거나 새 키워드를 사용하는 것보다 더 나빠 보이지만 개인적인 취향이므로 getters 및 setter를 만들거나 별도의 제어 기능 (열거 형, 쓰기 가능)을 사용하지 않아도됩니다. 구성 가능).
var Person={
talk:function(){console.log("I'm "+this.name);}
//,other prototype stuff related to Person
};
var userCreator={
processInstanceMembers:function(o,initObj){
this.createName(o,initObj.name);
Object.defineProperty(o,"_name",{writable:true});
o.name=initObj.name;
},
get:function(initObj,inheritFrom){
var ret=Object.create(inheritFrom||Person);
this.processInstanceMembers(ret,initObj);
return ret;
},
createName:function(o){//minimalise closure scope
Object.defineProperty(o,"name",{
get:function(){
return this._name;
},
set:function(val){
if(val.replace(/\s*/gm,"")===""){
throw new Error("Name can't be empty, or only whitespaces");
}
this._name=val;
},
enumerable : true
});
}
};
//when creating an instance you can choose what to inherit from
//leave it out to inherit from Person
var u=userCreator.get({name:"Ben"});
u.talk();
u.name="Benji";
u.talk();
u.name=" ";//error, name can't be empty
의 상속을 설정하는 부모의 새로운 인스턴스를 생성 :
이
var userB = {
init: function(nameParam) {
this.id = MY_GLOBAL.nextId();
this.name = nameParam;
},
sayHello: function() {
console.log('Hello '+ this.name);
}
};
var bob = Object.create(userB).init("Bob");
추가 컨트롤을 활용보다 복잡 하나가 이것이다 :
한 패턴은 init 함수를 사용하는 것 자식이 필요하지 않은 경우이 또는 도우미 함수에 Object.create를 사용할 수 있습니다.
var Child =function(){
//get Parent's INSTANCE members defined in the
//parent function body with this.parentInstance=...
Parent.apply(this,arguments);
}
Child.prototype=Object.create(Parent.prototype);
Child.prototype.constructor=Child;
Child.prototype.otherFn=function(){};
this이 재미있을 수 있습니다. 헬퍼 기능을 가지고 있으므로 원하지 않는 경우 Object.create를 사용할 필요가 없습니다.
참조 http://stackoverflow.com/questions/2709612/using-object-create-instead-of-new – mccainz
기술적으로 말해서 null을 상속하므로 객체가 테스트되지 않습니다. JavaScript의 객체에는 hasOwnProperty가 있어야하지만 테스트에는 포함되지 않습니다. 다른 사람들이 당신의 코드를 사용한다면 테스트가 JS 객체라고 기대할 수 있습니다. 다음과 같이 작성하십시오 :'test = Object.create (Object.prototype);' – HMR