成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript面向?qū)ο笾R(shí)點(diǎn)小結(jié)

rubyshen / 1424人閱讀

摘要:面向?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

相關(guān)文章

  • 編程模型(范式)小結(jié)

    摘要:參考鏈接面向?qū)ο缶幊棠P同F(xiàn)在的很多編程語言基本都具有面向?qū)ο蟮乃枷?,比如等等,而面向?qū)ο蟮闹饕枷雽?duì)象,類,繼承,封裝,多態(tài)比較容易理解,這里就不多多描述了。 前言 在我們的日常日發(fā)和學(xué)習(xí)生活中會(huì)常常遇到一些名詞,比如 命令式編程模型,聲明式編程模型,xxx語言是面向?qū)ο蟮牡鹊?,這個(gè)編程模型到處可見,但是始終搞不清是什么?什么語言又是什么編程模型,當(dāng)你新接觸一門語言的時(shí)候,有些問題是需...

    miya 評(píng)論0 收藏0
  • javascript 面向對(duì)象版塊之理解對(duì)象

    摘要:用代碼可以這樣描述安全到達(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ì)象。我們就要一些屬性,比...

    lovXin 評(píng)論0 收藏0
  • HTML5 Canvas游戲開發(fā)實(shí)戰(zhàn) PDF掃描版

    摘要:游戲開發(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)在原理,讓讀者不僅知其然,而且知其所以然。在本書...

    cocopeak 評(píng)論0 收藏0
  • javascript基礎(chǔ)篇小結(jié)

    摘要:表示尚未存在的對(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)用...

    hiyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<