javascript
JavaScript(十三)面向对象
面向?qū)ο?/strong>
面向?qū)ο蟮倪^程
通過new?構(gòu)造函數(shù)?生成的對象來執(zhí)行,?類似于事件的執(zhí)行? this指向函數(shù),然后再把這個函數(shù)賦值給一個實例 ?所以在函數(shù)內(nèi)的this? 就指到了實例上
function Person (age,lastname,) {this.age = agethis.lastname = lastname;}var xiaoming = new Person(12,'小明');console.log(xiaoming);?
構(gòu)造函數(shù)的首字母要大寫? 大家默認的規(guī)范
對象中若? value?非函數(shù) ?叫做屬性? ?若?是函數(shù)? 叫方法
this的指向
普通對象,計時器,定時器,this?質(zhì)量window?
對象中的方法的this? 指向這個對象,這個對象就和windows類似
綁定事件時?this指向?dom對象
閉包的this?指向上次運行的函數(shù)環(huán)境
自執(zhí)行函數(shù)? 指向window
對象中的定時器等的this仍是指向window?所以需要在對象內(nèi)備份?this?
實例與構(gòu)造函數(shù)的關(guān)系
新生成的對象? 有個屬性?constructor? ? ? 就是這個對象的構(gòu)造函數(shù)
實例? instanceof?構(gòu)造函數(shù)? ---->true
console.log(xiaoming.constructor); console.log(xiaoming instanceof Person);?
面向?qū)ο笾械念惖母拍?/strong>
就是?構(gòu)造函數(shù)? ,同一個構(gòu)造函數(shù)? new出來的?就屬于一個類
原型
構(gòu)造函數(shù)方法存在一定的弊端,對于對象中一成不變的屬性?并不需要每次都new ,這樣很浪費性能,那么? 就把這用一成不變的存儲到? ?構(gòu)造函數(shù)的原型上面
function Person (age,name,) {this.age = age;this.name = name;}Person.prototype.sex = 'male';var xiaoming = new Person(12,'xiaoming');console.log(xiaoming.sex);//這個性別就是從原型上繼承的構(gòu)造函數(shù)的原型除了以? ? fun.prototype.attr = ***;?的格式?
?
還可以? ?寫整個?原型? ??
Person.prototype = {age : 12,sex:'male',constructor : Person //這里如果不寫 new的實例調(diào)用constrotur 不會返回person 而返回 Object }?
?
prototype和__proto__
?prototype? ? 所有的函數(shù)都有原型prototype ??
?.__proto__ 所有的對象都有原型對象? ?∵所有的對象都是用構(gòu)造函數(shù)創(chuàng)建的
constructor,protype與__proto__
?
判斷這個實例是不是這個構(gòu)造函數(shù)new的
構(gòu)造函數(shù)的原型 .isProtypeOf(新對象)
利用 in?結(jié)合?hasOwnProperty判斷是不是從原型繼承來的屬性
for (var pro in xiaoming) {if(xiaoming.hasOwnProperty(pro)){console.log(pro + '是本地屬性')} }?綁定構(gòu)造函數(shù)? ? 兩個對象(構(gòu)造函數(shù)之間)繼承
1.call / apply?用父類? ? ?代替子類的this??
父構(gòu)造函數(shù).call(this,[arguments])
function Foo () {this.lastName = 'wang';}function Son (height) {Foo.call(this); //就這一步就可以繼承來 Foo的屬性this.height = height;}var xw = new Son(180);console.log(xw.lastName); //wang?
?
prototype的繼承方法
寫在perotype?上的屬性在生成實例的時候不會被?調(diào)用? ?所以?實例上的屬性由繼承來的更好? ?提取公共部分在原型上
function Foo() {this.firestName = '老王';}Foo.prototype.lastName = 'wang';function Son() {this.firstName = '小王';}Son.prototype = new Foo();Son.prototype.constrotur = Son;var xw = new Son();console.log(xw.firstName);console.log(xw.lastName);console.log(xw.constrotur);?利用空的函數(shù)的prototype?實現(xiàn)繼承
function extend(parent, child) { var F = function(){}; F.prototype = parent.prototype; child.prototype = new F(); child.prototype.constructor = child; child.uber = parent.prototype; }拷貝繼承?就是把parent.protype?上的屬性?遍歷拷貝到?child?的protype上
?
?
function copy(parent, child) {var p = parent.prototype;var c = child.prototype;for (var pro in p) {c[pro] = p[pro]; //這里的pro是屬性名!!!!是字符串形式的 所以只能用[]的形式 }c.uber = p;}?
轉(zhuǎn)載于:https://www.cnblogs.com/96weibin/p/8529050.html
總結(jié)
以上是生活随笔為你收集整理的JavaScript(十三)面向对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式 简单工厂模式
- 下一篇: 原生JS封装时间运动函数