수색…
표준 함수 프로토 타입
먼저 생성자로 사용할 Foo
함수를 정의합니다.
function Foo (){}
Foo.prototype
을 편집하여 Foo
모든 인스턴스에서 공유 할 속성과 메서드를 정의 할 수 있습니다.
Foo.prototype.bar = function() {
return 'I am bar';
};
그런 다음 new
키워드를 사용하여 인스턴스를 만들고 메서드를 호출 할 수 있습니다.
var foo = new Foo();
console.log(foo.bar()); // logs `I am bar`
Object.key와 Object.prototype.key의 차이점
파이썬과 같은 언어에서와 달리 생성자 함수의 정적 속성은 인스턴스에 상속 되지 않습니다 . 인스턴스는 부모 유형의 프로토 타입을 상속 한 프로토 타입에서만 상속합니다. 정적 속성은 상속되지 않습니다.
function Foo() {};
Foo.style = 'bold';
var foo = new Foo();
console.log(Foo.style); // 'bold'
console.log(foo.style); // undefined
Foo.prototype.style = 'italic';
console.log(Foo.style); // 'bold'
console.log(foo.style); // 'italic'
프로토 타입의 새 개체
JavaScript에서는 모든 객체가 다른 객체의 프로토 타입이 될 수 있습니다. 객체가 다른 객체의 프로토 타입으로 만들어지면 객체는 부모의 모든 속성을 상속받습니다.
var proto = { foo: "foo", bar: () => this.foo };
var obj = Object.create(proto);
console.log(obj.foo);
console.log(obj.bar());
콘솔 출력 :
> "foo"
> "foo"
참고 Object.create
는 ECMAScript 5에서 사용할 수 있지만 ECMAScript 3에 대한 지원이 필요한 경우 여기에 polyfill이 있습니다.
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
Object.create ()
Object.create () 메서드는 지정된 프로토 타입 객체 및 속성을 사용하여 새 객체를 만듭니다.
구문 : Object.create(proto[, propertiesObject])
매개 변수 :
- proto (새롭게 생성 된 객체의 원형이되는 객체)
- propertiesObject (선택 사항이며 정의되지 않은 경우 열거 가능 자체 속성 (즉, 자체 프로토 타입 체인에 따라 열거 가능한 속성이 아니라 속성 자체에 정의 된 속성)은 새로 작성된 객체에 추가 할 속성 설명자를 지정하고 해당하는 이 속성은 Object.defineProperties ()의 두 번째 인수에 해당합니다.
반환 값
지정된 프로토 타입 개체 및 속성을 가진 새 개체입니다.
예외
proto 파라미터가 null 또는 객체가 아닌 경우는 TypeError 예외입니다.
프로토 타이프 상속
prototype
이라는 일반 객체가 있다고 가정 해 보겠습니다.
var prototype = { foo: 'foo', bar: function () { return this.foo; } };
이제 prototype
을 상속 한 obj
라는 다른 객체가 필요합니다. prototype이 obj
의 프로토 prototype
이라고 말하는 것과 같습니다.
var obj = Object.create(prototype);
이제 prototype
모든 속성과 메서드를 obj
사용할 수 있습니다.
console.log(obj.foo);
console.log(obj.bar());
콘솔 출력
"foo"
"foo"
Prototypal 상속은 내부적으로 객체 참조를 통해 이루어지며 객체는 완전히 변경 가능합니다. 즉, 프로토 타입에 대한 모든 변경 사항은 프로토 타입이 프로토 타입 인 다른 모든 개체에 즉시 영향을줍니다.
prototype.foo = "bar";
console.log(obj.foo);
콘솔 출력
"bar"
Object.prototype
은 모든 객체의 프로토 타입이므로 특히 제 3 자 라이브러리를 사용하는 경우에는 사용하지 않는 것이 좋습니다.하지만 조금만 더 할 수 있습니다.
Object.prototype.breakingLibraries = 'foo';
console.log(obj.breakingLibraries);
console.log(prototype.breakingLibraries);
콘솔 출력
"foo"
"foo"
재미있는 사실 나는이 예제를 만들기 위해 브라우저 콘솔을 사용했고 breakingLibraries
속성을 추가하여이 페이지를 breakingLibraries
.
의사 고전적 상속
Prototype이 얼마나 강력한지를 보여주는 프로토 타입 상속 을 사용하여 고전적인 상속을 에뮬레이션합니다. 그것은 다른 언어에서 오는 프로그래머에게 더 매력적인 언어로 만들어졌습니다.
"클래스"는 new
피연산자와 함께 호출되도록 만들어진 함수이며 생성자로 사용됩니다.
function Foo(id, name) {
this.id = id;
this.name = name;
}
var foo = new Foo(1, 'foo');
console.log(foo.id);
콘솔 출력
1
foo는 Foo의 인스턴스입니다. JavaScript 코딩 규칙에 따르면 함수가 대문자로 시작하면 생성자 ( new
피연산자가있는)로 호출 할 수 있습니다.
"클래스"에 속성이나 메서드를 추가하려면 프로토 타입에 추가해야합니다.이 프로토 타입은 생성자의 prototype
속성에서 찾을 수 있습니다.
Foo.prototype.bar = 'bar';
console.log(foo.bar);
콘솔 출력
바
실제로 Foo가 "생성자"로서 수행하는 것은 프로토 타입으로 Foo.prototype
을 사용하여 객체를 만드는 것입니다.
모든 객체에서 해당 생성자에 대한 참조를 찾을 수 있습니다.
console.log(foo.constructor);
함수 Foo (id, name) {...
console.log({ }.constructor);
function Object () {[native code]}
또한 객체가 instanceof
연산자를 사용하여 지정된 클래스의 인스턴스인지 확인합니다.
console.log(foo instanceof Foo);
참된
console.log(foo instaceof Object);
참된
객체의 프로토 타입 설정하기
ES5 +를 사용하면 Object.create
함수를 사용하여 다른 객체가있는 객체를 프로토 타입으로 만들 수 있습니다.
const anyObj = {
hello() {
console.log(`this.foo is ${this.foo}`);
},
};
let objWithProto = Object.create(anyObj);
objWithProto.foo = 'bar';
objWithProto.hello(); // "this.foo is bar"
프로토 타입이없는 Object를 명시 적으로 만들려면 프로토 타입으로 null
을 사용합니다. 즉, Object는 Object.prototype
에서 상속받지 않으며 존재 확인 사전에 사용되는 Object에 유용합니다.
let objInheritingObject = {};
let objInheritingNull = Object.create(null);
'toString' in objInheritingObject; // true
'toString' in objInheritingNull ; // false
ES6에서 Object.setPrototypeOf
사용하여 기존 Object의 프로토 타입을 변경할 수 있습니다 (예 :
let obj = Object.create({foo: 'foo'});
obj = Object.setPrototypeOf(obj, {bar: 'bar'});
obj.foo; // undefined
obj.bar; // "bar"
이것은에 포함, 거의 모든 곳에서 할 수있는 this
객체 또는 생성자에.
참고 : 이 프로세스는 현재 브라우저에서 매우 느리고 사용하지 말고 원하는 프로토 타입으로 Object를 작성하십시오.
ES5 이전에는 수동으로 정의 된 프로토 타입으로 Object를 만드는 유일한 방법은 예를 들어 new
로 구성하는 것이 었습니다
var proto = {fizz: 'buzz'};
function ConstructMyObj() {}
ConstructMyObj.prototype = proto;
var objWithProto = new ConstructMyObj();
objWithProto.fizz; // "buzz"
이 동작은 Poly.cill을 작성할 수있는 Object.create
충분히 가깝습니다.