摘要:面向?qū)ο笾饕R(shí)點(diǎn)小結(jié),基于構(gòu)造函數(shù)可以理解為通過即將創(chuàng)建的對(duì)象將類實(shí)例化給一個(gè)對(duì)象賦予屬性或者方法原型便于方法的重用與構(gòu)造函數(shù)模式相比,使用原型對(duì)象的好處是可以讓所有對(duì)象實(shí)例共享它所包含的屬性和方法。
JavaScript面向?qū)ο笾饕R(shí)點(diǎn)小結(jié),基于ECMAScript 5.
構(gòu)造函數(shù)function People(name){ //this可以理解為通過new即將創(chuàng)建的對(duì)象 this.name = name; } //將類實(shí)例化 var person = new People("Cassie Xu"); console.log(person.name);
給一個(gè)對(duì)象賦予屬性或者方法
function People(name) { this.name = name; this.greet = function() { console.log("Hello, my name is " + this.name + "!"); }; } var person = new People("Cassie Xu"); person.greet();原型(prototype)
why we use prototype? -> 便于方法的重用
與構(gòu)造函數(shù)模式相比,使用原型對(duì)象的好處是可以讓所有對(duì)象實(shí)例共享它所包含的屬性和方法。
運(yùn)行時(shí)沒找到函數(shù)的方法時(shí),對(duì)象會(huì)首先找它的類的prototype方法
Demo1
function People(name) { this.name = name; } People.prototype = { greet: function() { console.log("Hello, my name is " + this.name + "!"); } }; var person = new People("Cassie Xu"); person.greet(); //在每個(gè)實(shí)例化后的對(duì)象都會(huì)有一個(gè)__proto__屬性,類會(huì)將它的prototype賦給實(shí)例 //實(shí)例化一個(gè)對(duì)象時(shí),People這個(gè)類首先會(huì)將person的__proto屬性指向People.prototype console.log(person.__proto__ === People.prototype); // true
Demo2
var a = { foo: 1 }; var b = { bar: 2 }; b.__proto__ = a; //b本身沒有foo屬性,但是b會(huì)繼續(xù)尋找__proto__屬性 console.log(b.foo); // 1 console.log(b.bar); // 2 var a = {}; console.log(a.__proto__); // {} console.log(a.__proto__.__proto__); // null原型鏈(prototype chain)
var a = {}; console.log(a.__proto__); // {} console.log(a.__proto__.__proto__); // null繼承(Inheritance)
Demo1
function Parent(){} Parent.prototype = { greet: function(){ console.log("hello world"); } } function Child(){} //此方法適用于父類Child不需要傳參數(shù) Child.prototype = new Parent(); var c = new Child(); //c首先尋找自身的方法,沒有g(shù)reat,所以找Child的原型方法,而Child.prototype等于Parent方法 c.greet(); //console.log("hello world");
上面的例子如果Parent有參數(shù),將存在以下問題:
function Parent(a, b) {} Parent.prototype.greet = function() { console.log("JavaScript rocks"); } function Child(a, b) {} Child.prototype = new Parent(); //something wrong?->new Parent()不能傳參數(shù),否則參數(shù)一直不變 var child = new Child(); child.greet();
Demo2
解決父類參數(shù)問題
function Parent() { this.name = "xxx", this.date = "xxx" } Parent.prototype.greet = function() { console.log("JavaScript rocks"); } function Child() {} //此方法適用于 Child.prototype = Object.create(Parent.prototype); //硬記的知識(shí) Child.prototype.constructor = Child; var child = new Child(); child.greet();
Demo3:繼承的一個(gè)實(shí)例
創(chuàng)建一個(gè)矩形
function Rect(width,height){ this._setupDOM(width,height); } Rect.prototype._setupDOM = function(width,height){ this._dom = document.createElement("div"); this._dom.style.width = width + "px"; this._dom.style.height = height + "px"; }; Rect.prototype.appendToBody = function(){ document.body.appendChild(this._dom); }; function BlueRect(width,height){ BlueRect._super.apply(this,arguments); } BlueRect.prototype = Object.create(Rect.prototype); BlueRect.prototype.constructor = BlueRect; BlueRect._super = Rect; BlueRect.prototype._setupDOM = function(width,height){ BlueRect._super.prototype._setupDOM.apply(this,arguments); this._dom.style.backgroundColor = "blue"; }; var br = new BlueRect(200,300); br.appendToBody();this關(guān)鍵字
Demo:
function Rect(width,height){ //私有屬性加_ this._dom = document.createElement("div"); this._dom.style.width = width + "px"; this._dom.style.height = height + "px"; this._dom.style.backgroundColor = "red"; } Rect.prototype.appendToBody = function(){ document.body.appendChild(this._dom); }; var rect = new Rect(100,100); rect.appendToBody();
修改上面demo:
function Rect(width,height){ this._setupDom(width,height); } Rect.prototype._setupDom = function(width,height){ //私有屬性加_ this._dom = document.createElement("div"); this._dom.style.width = width + "px"; this._dom.style.height = height + "px"; this._dom.style.backgroundColor = "red"; }; Rect.prototype.appendToBody = function(){ document.body.appendChild(this._dom); }; var rect = new Rect(100,100); rect.appendToBody(); var person = { firstName: "Penelope", lastName: "Barrymore", sayFullName: function () { console.log(this.firstName + " " + this.lastName); //=> "Penelope Barrymore" console.log(person.firstName + " " + person.lastName); //=> "Penelope Barrymore" } }; person.sayFullName();
嚴(yán)格模式下的this
funtion foo(){ "use strict"; console.log(this) //undefined }強(qiáng)制修改函數(shù)上下文的方法 用Object.bind()代替this
function foo(a, b) { console.log(this); console.log(a + b); } var fooBinding = foo.bind({ name: "Cassie Xu" }); fooBinding(1, 2);
上面code將輸出
[object Object] { name: "Cassie Xu" }使用Object.call/Object.apply執(zhí)行上下文
call/apply方法都為調(diào)用Object方法,區(qū)別是apply將所有參數(shù)放到一個(gè)數(shù)組中去
function foo(a, b) { console.log(this); console.log(a + b); } foo.call({name:"Cassie Xu"}, 1, 2); foo.apply({name:"Cassie Xu"}, [1, 2]);補(bǔ)充其他 自執(zhí)行函數(shù)
why we use it? ->避免泄露全局變量
(function(c){ var a = 1; var b = 2; console.log(a+b+c); })(3) // c = 3閉包作用域
var a = {}; a.foo = function(callback) { // do something and call callback in whatever way } a.bar = function() { this.num = 1; var that = this; //閉包,這里that可以訪問到a.bar的作用域 this.foo(function(newNum) { that.num = newNum; }); console.log(this.num); } a.bar();
本文轉(zhuǎn)自 JavaScript面向?qū)ο笾R(shí)點(diǎn)小結(jié)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85538.html
摘要:參考鏈接面向?qū)ο缶幊棠P同F(xiàn)在的很多編程語言基本都具有面向?qū)ο蟮乃枷?,比如等等,而面向?qū)ο蟮闹饕枷雽?duì)象,類,繼承,封裝,多態(tài)比較容易理解,這里就不多多描述了。 前言 在我們的日常日發(fā)和學(xué)習(xí)生活中會(huì)常常遇到一些名詞,比如 命令式編程模型,聲明式編程模型,xxx語言是面向?qū)ο蟮牡鹊?,這個(gè)編程模型到處可見,但是始終搞不清是什么?什么語言又是什么編程模型,當(dāng)你新接觸一門語言的時(shí)候,有些問題是需...
摘要:用代碼可以這樣描述安全到達(dá)國外面向過程既然說了面向?qū)ο?,那么與之對(duì)應(yīng)的就是面向過程。小結(jié)在這篇文章中,介紹了什么是面向?qū)ο蠛兔嫦蜻^程,以及中對(duì)象的含義。 這是 javascript 面向?qū)ο蟀鎵K的第一篇文章,主要講解對(duì)面向?qū)ο笏枷氲囊粋€(gè)理解。先說說什么是對(duì)象,其實(shí)這個(gè)還真的不好說。我們可以把自己當(dāng)成一個(gè)對(duì)象,或者過年的時(shí)候相親,找對(duì)象,那么你未來的老婆也是一個(gè)對(duì)象。我們就要一些屬性,比...
摘要:游戲開發(fā)實(shí)戰(zhàn)主要講解使用來開發(fā)和設(shè)計(jì)各類常見游戲的思路和技巧,在介紹相關(guān)特性的同時(shí),還通過游戲開發(fā)實(shí)例深入剖析了其內(nèi)在原理,讓讀者不僅知其然,而且知其所以然。HTML5 Canvas游戲開發(fā)實(shí)戰(zhàn)主要講解使用HTML5 Canvas來開發(fā)和設(shè)計(jì)各類常見游戲的思路和技巧,在介紹HTML5 Canvas相關(guān)特性的同時(shí),還通過游戲開發(fā)實(shí)例深入剖析了其內(nèi)在原理,讓讀者不僅知其然,而且知其所以然。在本書...
摘要:表示尚未存在的對(duì)象是一個(gè)有特殊意義的值??梢詾樽兞抠x值為,此時(shí)變量的值為已知狀態(tài)不是,即。用來初始化變量,清除變量?jī)?nèi)容,釋放內(nèi)存結(jié)果為但含義不同。且它倆與所有其他值比較的結(jié)果都是。,需要兩個(gè)操作數(shù)同時(shí)轉(zhuǎn)為。 轉(zhuǎn)載請(qǐng)聲明出處 博客原文 隨手翻閱以前的學(xué)習(xí)筆記,順便整理一下放在這里,方便自己復(fù)習(xí),也希望你有也有幫助吧 第一課時(shí) 入門基礎(chǔ) 知識(shí)點(diǎn): 操作系統(tǒng)就是個(gè)應(yīng)用程序 只要是應(yīng)用...
閱讀 3848·2021-09-27 13:56
閱讀 887·2021-09-08 09:36
閱讀 775·2019-08-30 15:54
閱讀 618·2019-08-29 17:29
閱讀 938·2019-08-29 17:21
閱讀 1692·2019-08-29 16:59
閱讀 2770·2019-08-29 13:03
閱讀 2972·2019-08-29 12:47