프로그래밍에 대한 지식이있는 사람들은 객체 지향이 이해하기 매우 어려운 개념이라는 것을 알고 있습니다. 다음 Xiaoqian은 객체에 대한 이해를 공유 할 것이며,이 기사는 주로 객체의 캡슐화를 공유합니다. 물론 실생활에서의 객체 지향도 꽤 어렵 네요. 하하하 ~
하나, 인스턴스 객체의 원래 모드
우선, 우리는 모든 개체가 개체라는 것을 알고 있습니다. 예를 들어 개체로서의 "개"에는 "유형"과 "색상"이라는 두 가지 속성이 있습니다.
그런 다음 인스턴스화 된 두 개의 개체를 만들어야합니다.
이것은 또한 가장 기본적인 객체 캡슐화입니다. 즉, "type"과 "color"의 두 속성을 하나의 객체에 넣는 것입니다. 하지만 여기에 문제가 있습니다. 이러한 작성 방법에는 두 가지 문제가 있습니다. 하나는 인스턴스화 된 객체를 많이 생성하려면 여러 번 반복해야한다는 것입니다. 프로토 타입 Dog 구조와 유사하지만 실제로는 직접 설정되지 않습니다.
둘째, 원래 모델 업그레이드
중복 코드, 우리는 해결할 함수를 작성할 수 있습니다.
그런 다음 함수를 호출하여 인스턴스화 된 개체를 생성합니다.
이 방법은 여러 개의 인스턴스화 된 객체 코드를 생성하는 복잡한 문제를 해결할 수 있지만 dog1과 dog2 사이에는 연관성이 없습니다. 즉, 실제로 프로토 타입 객체 Dog의 인스턴스임을 반영하지 않습니다.
셋, 생성자
인스턴스화 된 객체가 프로토 타입 객체에서 생성되어야하는 문제를 해결하기 위해 js는 생성자 개념을 제공합니다. 물론 생성자는 기본적으로 일반 함수이지만 함수는 내부에서 사용합니다. 일반 함수와 구별하기 위해 일반적으로 생성자의 첫 글자를 대문자로 사용합니다. 특정 코드는 다음과 같습니다.
이 생성자를 사용하여 인스턴스화 된 객체를 생성 할 수 있습니다. 특정 코드는 다음과 같습니다.
여기에서 new 키워드를 볼 수 있습니다. 즉 Dog는 실제로 객체이고 dog1과 dog2는 Dog의 인스턴스화 된 객체입니다.이를 확인하기 위해 js는 구성 함수를 가리키는 데 사용되는 속성 생성자를 제공합니다.
물론 js에는 프로토 타입 객체와 인스턴스화 된 객체 간의 관계를 확인할 수있는 다른 연산자 instanceof도 있습니다.
생성자는 여기에서 완벽 해 보이지만 여기에는 메모리 낭비라는 큰 결점이 있습니다. 예를 들어, 이제 다음과 같이 Dog 객체에 상수 속성과 메서드를 추가합니다.
当然这里生成实例化方法也还是一样的,但是这里会有一个很大的问题:也就是我们会发现age属性和eat()方法明明是一模一样的内容,但是由于每次生成实例化对象时,都会生成同样的内容,多造成内存浪费。
console.log(dog1.eat == dog2.eat); // false
如果能让age和eat()在内存中只生成一次,让实例化对象指向同一个内存地址就更完美了。
四,prototype模式
js为每一个构造函数都提供了一个prototype属性,让他指向另一个对象,而这个对象的所有属性和方法都会被构造函数的实例对象继承。这也就意味着,只要我们把那些不变的属性和方法定义在prototype对象上即可。
接着再生成实例,此时,所有实例的age个eat()方法都会指向同一个内存地址,也就是prototype对象,这样也就避免了内存浪费问题,从而提供运行效率。
console.log(dog1.eat == dog2.eat); // true
当然为了验证这一问题,js定义了一些辅助属性。
1. isPrototypeOf() , 此方法用于验证prototype对象和实例化对象之间的关联
console.log(Dog.prototype.isPrototypeOf(dog1)); // true console.log(Dog.prototype.isPrototypeOf(dog2)); // true
2. HasOwnProperty() , 每个实例化对象都有此方法,顾名思义,这个方法是用于验证属性是自有的还是继承自prototype对象的 ; 这里很显然type是自有属性,而age是继承自prototype对象。
console.log(dog1.hasOwnProperty('type')) // true console.log (dog1.hasOwnProperty ( 'age')) // false
이 기사는 Qianfeng Education 에서 가져온 것 입니다. 재 인쇄의 출처를 표시하십시오.