js之面向对象
本文的面向對象分為ES6和ES6之前的,重點學習ES6的
===============================
一、面向對象
1、什么是面向對象
a)什么是對象:萬物都可以抽象成對象
時間對象
var oDate=new Date();(我們經常var的oDate就是一個時間對象)
oDate.getFullYear();(新建的oDate就繼承了Date里面的所有方法)
數組
var arr=new Array();
arr.sort();
arr.length;
json{
name:'aa',
showName:function(){
alert(1);
}
}
json.name;(json對象的屬性)
json.showName();(json對象的方法)
b)面向對象是一種思想:
我們只關心怎么去用,不關心里面是怎么實現的
提高了效率
2、怎么去面向對象
a)先要有一個對象
對象都有特征,都有屬性和方法
屬性 屬性就是變量,只不過他有依附關系
特征?變量 自由的,獨立的
方法 就是函數,只不過他有依附關系
函數 獨立的
b)造對象
1、var arr=[];
批量造對象
c)構造函數:用來造對象的函數,構造函數也是函數,只是因為用途而得名,為了和普通函數做區別,首字母大寫就是構造函數
d)this 想要學好面向對象 必須知道this指向誰
new是干什么的
1、會在構造函數開始的位置創建一個空對象(并且把this指向空對象);
2、自動返回空對象
e)屬性不同的,方法是相同的
是ES6之前面向對象的核心:原型
f)面向對象怎么寫: 構造原型混合模式
1、構造身上加屬性
2、原型身上加方法 prototype
function Person(name,age){
//添加屬性和方法
this.name=name;
this.age=age;
}
Person.prototype.showName=function(){
alert('我是舞王'+this.name);
};
g)prototype 也是對象
1、寫面向對象是為了擴展系統方法
h)arr.indexOf()
練習題:
時間對象里面 getDay 0-6 0星期天
getCnDay 星期一 --- 星期日
-----------------------------------
二、總結:
1.什么是對象:
一切都是對象
2.什么是面向對象:
只關心怎么調用,不關心怎么實現的
3.怎么寫一個類 就是一個構造函數
屬性加在構造身上
方法加在原型身上
function Person(...){
this.XX=XXX //加屬性
}
Person.prototype.XXX=function(){}; //加方法
4.怎么去造一個對象
new 類名()
eg var barry=new Person();(barry獲得person的屬性和方法)
5.new 都干了什么
1)、造一個空對象,并把this指向對象
2)、返回這個對象
6.prototype原型:
1)、可以寫面向對象
2)、可以擴展系統的方法
7.原型和原型鏈的區別
原型prototype 就是一個對象,存在于每個對象身上
原型鏈:就是因為有prototype的存在,js產生了原型鏈
8.ECMAScript 里面的方法都是用原型寫的
類 在js里面類就是構造函數
實例 構造函數調用完返回的對象
9.面向對象--一種思想
10.面向對象的特征:
封裝 抽象了事物的核心
多態 一個事物可以繼承多個親屬的特征
繼承 事物得到了父親的一些特征
-----------------------------------
11.object
instanceof 檢測一個物體的血緣關系
子級 instanceof 父級 返回true false
constructor 物體是由那個構造器誕生的
子級.constructor==父級 返回true false
包裝類(是java里面的)
簡寫的數據類型object不認。
12.this 有優先級 從上到下,優先級變小
new object
定時器 window
事件 觸發事件的對象
對象 對象
show() window
13.繼承 子級繼承父級的功能
給父級一個功能,子級默認就有
玩繼承:
屬性
在子級的構造中,調用父級的構造
function 子級(name,age){
//父級.call(this,name,age);
父級.apply(this,arguments);
}
方法
1、son.prototype=father.prototype;
問題:子級改了父級也改變
2、for(var name in father.prototype){
son.prototype[name]=father.prototype[name];
}
問題:孩子不認爺爺
3、 子級.prototype=new 父級();
問題:子級的孩子不認子級
終極版:子級.prototype.constructor=子級;
-----------------------------------------------
三、ES6
1.對象
let name='張三';
let json={
name,
showName(){
alert(this.name)
}
}
2.面向對象
class Person{ //類
constructor(name,age){ //構造 屬性加在構造身上
this.name=name;
this.age=age;
}
showName(){
alert(this.name);
}
showAge(){
alert(this.age);
}
}
3.繼承
class Student extends Person{
constructor(name,age,job){
super(name,age);//super在這里就是向上越級繼承父級的屬性
this.job=job;本身又加的屬性
}
showJob(){
alert(this.job);
}
}
-------------------------------------------------
ES6之前構造函數里子級繼承父級的屬性
函數名.call(this的指向,參數。。。。)針對多個參數的情況,不確定數量
函數名.apply(this的指向,[參數,參數。。。。]);
------------------
對象引用
js為了節省空間,采取的一種行為;
var arr=[1,2,3];
var arr2=arr;
------------------
for-in 通過對象的屬性進行循環
用來循環對象的。但是能用for循環就不用for-in
for var i=0;i<10;i++
-------------------
json{
"a":"1",
"b":"2",
"c":"3"
}
?for(var v in json){
console.log(v);//打印出1,2,3
}
?
轉載于:https://www.cnblogs.com/barry1102/p/6955074.html
總結
- 上一篇: 2015-2016 ACM-ICPC S
- 下一篇: LA 6892 The Safe Sec