자바스크립트 객체지향을 배우고 자바스크립트 프로토타입 및 프로토타입 chain_javascript 기술을 이해합니다.
먼저 사진을 보고 정리해보세요.
1. 기본 개념
[프로토타입 체인]각 생성자에는 개체가 있고, 프로토타입 개체에는 생성자에 대한 포인터가 포함되어 있으며, 인스턴스에는 프로토타입 개체에 대한 내부 포인터가 포함되어 있습니다. 그런 다음 프로토타입 개체가 다른 프로토타입의 인스턴스와 동일하면 이때 프로토타입 개체에는 다른 프로토타입에 대한 포인터가 포함됩니다. 이에 따라 다른 프로토타입에도 다른 생성자에 대한 포인터가 포함됩니다. 다른 프로토타입이 다른 프로토타입의 인스턴스인 경우 위의 관계는 여전히 유지됩니다. 이러한 계층별 진행은 인스턴스와 프로토타입의 체인을 형성합니다.
【프로토타입 객체】이 객체에는 특정 유형의 모든 인스턴스가 공유할 수 있는 속성과 메서드가 포함되어 있습니다. 모든 참조 유형은 기본적으로 Object를 상속하며, 이 상속도 프로토타입 체인을 통해 구현됩니다. 모든 함수의 기본 프로토타입은 Object의 인스턴스이므로 기본 프로토타입에는 Object.prototype을 가리키는 내부 포인터가 포함됩니다. 이것이 바로 모든 사용자 정의 유형이 toString() 및 valueOf() 메서드를 상속하는 이유입니다.
[생성자]생성자와 다른 함수의 차이점은 호출 방식에 있습니다. 일반적으로 함수는 new 연산자를 통해 호출되면 생성자로 사용할 수 있지만, new 연산자를 통해 호출되지 않으면 일반 함수와 다르지 않습니다.
[참고] JavaScript의 사용자 정의 함수 및 내장 생성자를 생성자로 사용할 수 있습니다
[생성자 작성법]생성자는 항상 대문자로 시작하고, 비생성자는 소문자로 시작해야 합니다. 이 접근 방식은 주로 ECMAScript의 다른 함수와 구별하기 위해 다른 OO 언어에서 차용한 것입니다. 생성자 자체도 함수이지만 객체를 생성하는 데 사용할 수 있기 때문입니다
[생성자의 세 가지 사용 시나리오]
[a] 생성자로 사용
var person = new Person("Nicholas",29,"software Engineer"); person.sayName();
[b] 일반 함수로 호출
Person("greg",27,"doctor");//添加到window window.sayName();//"Greg"
[c] 다른 객체의 범위에서
을 호출합니다.
var o = new Object(); Person.call(o,"Kristen",25,"Nurse"); o.sayName();//"Kristen"
【prototype属性】只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。
[注意]只有函数才有prototype属性,object没有prototype属性
【constructor属性】在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针
[注意]创建了自定义的构造函数之后,其原型对象默认只会取得constructor属性,至于其他方法则都是从Object继承而来的
【_proto_和[[prototype]]】当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象。ECMA-262第5版管这个指针叫[[prototype]]。虽然在脚本中标准的方式访问[[prototype]],但firefox\safari\chrome在每个对象上都支持一个属性_proto_;而在其他实现中,这个属性对脚本则是完全不可见的。这个连接存在于实例与构造函数的原型对象之间,而不是存在于实例与构造函数之间
二、基本操作
【原型链查询】每当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。搜索首先从对象实例本身开始,如果在实例中找到了具有给定名字的属性,则返回该属性的值;如果没有找到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性,如果找到了这个属性,则返回该属性的值。
【添加实例属性】当为对象实例添加一个属性时,这个属性就会屏蔽原型对象中保存的同名属性;换句话说,添加这个属性只会阻止我们访问原型中的那个属性,但不会修改那个属性,即使将这个属性设置为null,也只会在实例中设置这个属性,而不会恢复其指向原型的连接。不过,使用delete操作符则可以完全删除实例属性,从而让我们能够重新访问原型中的属性。
【原型的动态性】由于在原型中查找值的过程是一次搜索,因此我们对原型对象所做的任何修改都能立即从实例上反映出来,即使是先创建了实例后修改原型也照样如此。
[注意]不推荐在产品化的程序中修改原生对象的原型
function Person(){}; var friend = new Person(); Person.prototype.sayHi = function(){ alert('hi'); } friend.sayHi();//"hi"
【重写原型】调用构造函数时会为实例添加一个指向最初原型的[[prototype]]指针,而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。实例中的指针仅指向原型,而不指向构造函数。
三、基本方法
[1]isPrototypeOf():判断实例对象和原型对象是否存在于同一原型链中,只要是原型链中出现过的原型,都可以说是该原型链所派生的实例的原型
function Person(){}; var person1 = new Person(); var person2 = new Object(); console.log(Person.prototype.isPrototypeOf(person1));//true console.log(Object.prototype.isPrototypeOf(person1));//true console.log(Person.prototype.isPrototypeOf(person2));//false console.log(Object.prototype.isPrototypeOf(person2));//true
[2]ECMAScript5新增方法Object.getPrototypeOf():这个方法返回[[Prototype]]的值
function Person(){}; var person1 = new Person(); var person2 = new Object(); console.log(Object.getPrototypeOf(person1)); //Person{} console.log(Object.getPrototypeOf(person1) === Person.prototype); //true console.log(Object.getPrototypeOf(person1) === Object.prototype); //false console.log(Object.getPrototypeOf(person2)); //Object{}
[3]hasOwnProperty():检测一个属性是否存在于实例中
function Person(){ Person.prototype.name = 'Nicholas'; } var person1 = new Person(); //不存在实例中,但存在原型中 console.log(person1.hasOwnProperty("name"));//false //不存在实例中,也不存在原型中 console.log(person1.hasOwnProperty("no"));//false person1.name = 'Greg'; console.log(person1.name);//'Greg' console.log(person1.hasOwnProperty('name'));//true delete person1.name; console.log(person1.name);//"Nicholas" console.log(person1.hasOwnProperty('name'));//false
[4]ECMAScript5的Object.getOwnPropertyDescriptor():只能用于取得实例属性的描述符,要取得原型属性的描述符,必须直接在原型对象上调用Object.getOwnPropertyDescription()方法
function Person(){ Person.prototype.name = 'Nicholas'; } var person1 = new Person(); person1.name = 'cook'; console.log(Object.getOwnPropertyDescriptor(person1,"name"));//Object {value: "cook", writable: true, enumerable: true, configurable: true} console.log(Object.getOwnPropertyDescriptor(Person.prototype,"name"));//Object {value: "Nicholas", writable: true, enumerable: true, configurable: true}
[5]in操作符:在通过对象能够访问给定属性时返回true,无论该属性存在于实例还是原型中
function Person(){} var person1 = new Person(); person1.name = 'cook'; console.log("name" in person1);//true console.log("name" in Person.prototype);//false var person2 = new Person(); Person.prototype.name = 'cook'; console.log("name" in person2);//true console.log("name" in Person.prototype);//true
[6]同时使用hasOwnProperty()方法和in操作符,来确定属性是否存在于实例中
//hasOwnProperty()返回false,且in操作符返回true,则函数返回true,判定是原型中的属性 function hasPrototypeProperty(object,name){ return !object.hasOwnProperty(name) && (name in object); } function Person(){ Person.prototype.name = 'Nicholas'; } var person1 = new Person(); console.log(hasPrototypeProperty(person1,'name'));//true person1.name = 'cook'; console.log(hasPrototypeProperty(person1,'name'));//false delete person1.name; console.log(hasPrototypeProperty(person1,'name'));//true delete Person.prototype.name; console.log(hasPrototypeProperty(person1,'name'));//false
[7]ECMAScript5的Object.keys()方法:接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组
[注意]一定要先new出实例对象再使用该方法,否则为空
function Person(){ Person.prototype.name = 'Nicholas'; Person.prototype.age = 29; Person.prototype.job = 'Software Engineer'; Person.prototype.sayName = function(){ alert(this.name); } }; var keys = Object.keys(Person.prototype); console.log(keys);//[] var p1 = new Person(); p1.name = "Rob"; p1.age = 31; var keys = Object.keys(Person.prototype); console.log(keys);//["name","age","job","sayName"] var p1Keys = Object.keys(p1); console.log(p1Keys);//["name","age"]
[8]ECMAScript5的Object.getOwnPropertyNames()方法:接收一个对象作为参数,返回一个包含所有属性的字符串数组
[注意]一定要先new出实例对象再使用该方法,否则只有constructor
function Person(){ Person.prototype.name = 'Nicholas'; Person.prototype.age = 29; Person.prototype.job = 'Software Engineer'; Person.prototype.sayName = function(){ alert(this.name); } }; var keys = Object.getOwnPropertyNames(Person.prototype); console.log(keys);//["constructor"] var p1 = new Person(); var keys = Object.getOwnPropertyNames(Person.prototype); console.log(keys);//["constructor", "name", "age", "job", "sayName"]
希望本文所述对大家学习javascript程序设计有所帮助。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











WebSocket 및 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 소개: 지속적인 기술 개발로 음성 인식 기술은 인공 지능 분야의 중요한 부분이 되었습니다. WebSocket과 JavaScript를 기반으로 한 온라인 음성 인식 시스템은 낮은 대기 시간, 실시간, 크로스 플랫폼이라는 특징을 갖고 있으며 널리 사용되는 솔루션이 되었습니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법을 소개합니다.

WebSocket과 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 서론: 인터넷 기술의 급속한 발전과 함께 실시간 모니터링 시스템이 다양한 분야에서 널리 활용되고 있다. 실시간 모니터링을 구현하는 핵심 기술 중 하나는 WebSocket과 JavaScript의 조합입니다. 이 기사에서는 실시간 모니터링 시스템에서 WebSocket 및 JavaScript의 적용을 소개하고 코드 예제를 제공하며 구현 원칙을 자세히 설명합니다. 1. 웹소켓 기술

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 소개: 인터넷의 대중화와 기술의 발전으로 점점 더 많은 레스토랑에서 온라인 주문 서비스를 제공하기 시작했습니다. 실시간 온라인 주문 시스템을 구현하기 위해 JavaScript 및 WebSocket 기술을 사용할 수 있습니다. WebSocket은 TCP 프로토콜을 기반으로 하는 전이중 통신 프로토콜로 클라이언트와 서버 간의 실시간 양방향 통신을 실현할 수 있습니다. 실시간 온라인 주문 시스템에서는 사용자가 요리를 선택하고 주문을 하면

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 오늘날의 디지털 시대에는 점점 더 많은 기업과 서비스에서 온라인 예약 기능을 제공해야 합니다. 효율적인 실시간 온라인 예약 시스템을 구현하는 것이 중요합니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. WebSocket이란 무엇입니까? WebSocket은 단일 TCP 연결의 전이중 방식입니다.

JavaScript 및 WebSocket: 효율적인 실시간 일기 예보 시스템 구축 소개: 오늘날 일기 예보의 정확성은 일상 생활과 의사 결정에 매우 중요합니다. 기술이 발전함에 따라 우리는 날씨 데이터를 실시간으로 획득함으로써 보다 정확하고 신뢰할 수 있는 일기예보를 제공할 수 있습니다. 이 기사에서는 JavaScript 및 WebSocket 기술을 사용하여 효율적인 실시간 일기 예보 시스템을 구축하는 방법을 알아봅니다. 이 문서에서는 특정 코드 예제를 통해 구현 프로세스를 보여줍니다. 우리

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

JavaScript는 웹 개발에 널리 사용되는 프로그래밍 언어인 반면 WebSocket은 실시간 통신에 사용되는 네트워크 프로토콜입니다. 두 가지의 강력한 기능을 결합하면 효율적인 실시간 영상 처리 시스템을 만들 수 있습니다. 이 기사에서는 JavaScript와 WebSocket을 사용하여 이 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 첫째, 실시간 영상처리 시스템의 요구사항과 목표를 명확히 할 필요가 있다. 실시간 이미지 데이터를 수집할 수 있는 카메라 장치가 있다고 가정해 보겠습니다.

Genshin Impact 버전 4.4의 새로운 지도를 소개합니다. Genshin Impact 4.4 버전은 또한 Liyue에서 Sea Lantern Festival을 열었습니다. 동시에 버전 4.4에서는 Shen Yu Valley라는 새로운 지도 영역이 출시됩니다. 제공된 정보에 따르면 Shen Yugu는 실제로 Qiaoying Village의 일부이지만 플레이어는 Shen Yugu라고 부르는 데 더 익숙합니다. 이제 새로운 맵을 소개하겠습니다. Genshin Impact 버전 4.4의 새로운 지도 소개 버전 4.4에서는 Liyue 북쪽에 "Chenyu Valley·Shanggu", "Chenyu Valley·Nanling" 및 "Laixin Mountain"이 개방됩니다. 계곡·상구' . ※마신 퀘스트·액트 3: 용과 자유의 노래 프롤로그를 완료하면 순간이동 앵커 포인트가 자동으로 잠금 해제됩니다. 2. Qiaoyingzhuang 따뜻한 봄바람이 천위의 산과 들에 다시 한 번 스며들 때, 향기로운
