變數
var num;
//宣告
num =1;
//賦值
var num1 =1;
//宣告和賦值
num2 =1;
//直接賦值未宣告變數,變數變為全域性變數。
直接使用未宣告變數,報錯
var num3 =1;
var num3;
//重新宣告乙個宣告過的變數,二次宣告無效。
var num3 =2;
//但是賦值操作會覆蓋。使用let沒有這個情況
var的作用域是函式作用域,但是不是塊作用域,類似於if
,for()
這種塊裡面使用var宣告的變數都不是在這個塊作用域裡面的。
let的作用域是塊。
var num1 =1;
console.
log(num1)
;//1
function
demo()
報錯,沒有宣告直接使用
報錯,沒有宣告直接使用if(
true
)console.
log(num4)
;//4for (; 1 ;)console.
log(num5)
;//5while (true) console.
log(num6)
;//6
物件導向核心規則:
1.所有的函式物件都有乙個原型物件(prototype);
2.所有的物件上都有乙個隱式原型(__proto__)指向建立該物件的建構函式的原型;
3.所有的原型上都有乙個constructr指向該原型所在的建構函式本身;
建構函式模式constructor
所謂建構函式,就是普通函式,但是內部使用了this變數,
對建構函式使用new運算子,就能生成例項,並且this變數會繫結在例項物件上
function
cat(name,color)
var cat1 =
newcat
("大毛"
,"黃色");
var cat2 =
newcat
("二毛"
,"黑色");
alert
(cat1.name)
;// 大毛
alert
(cat1.color)
;// 黃色
這時cat1和cat2會自動含有乙個constructor屬性,指向它們的建構函式
cat1.constructor == cat
prototype模式
每乙個建構函式都有乙個prototype屬性,指向另乙個物件。
這個物件的屬性和方法,都會被建構函式的例項繼承。
為了解決建構函式占用重複記憶體,我們將共有的屬性和方法放在prototype物件上(公共區域)
cat.prototype.
eat=
function()
;cat1.eat == cat2.eat//true
prototype模式驗證方法
isprototypeof()
用來判斷某個某個物件的原型與某個例項之間的關係
cat.prototype.
isprototypeofh
(cat1)
hasownproperty()
每個物件都有乙個hasownproperty()方法,
用來判斷某乙個屬性到底是本地屬性,還是繼承prototype(繼承下的)物件的屬性;
in運算子
用來判斷例項物件是否含有某個屬性,不管是不是本地屬性還是繼承屬性;
還iah可以用來遍歷某個物件的所有屬性;
for(
var key in cat1)
]=` + cat1[key]);
}繼承建構函式繫結
function
cat(name,age)
prototyoe模式
如果貓的prototype指向乙個animal例項那麼所有貓的例項都能繼承animal了
cat.prototype=
newanimal()
;//此時的cat.prototype.constructor==animal;cat1明明是用建構函式cat生成的,
因此我們必須手動矯正
cat.prototype.constructor=cat;
let cat1=
newcat()
;直接繼承
cat.prototype=animal.prototype;
cat.prototype,constructor=cat;
但是改變cat原型,animal的原型也會改變。不可取
空物件繼承
建立乙個空的函式物件
varf
=function()
;將該函式物件的原型指向父物件的原型
f.prototype = parent.prototype;
刪除了子物件prototype 物件原先的值,然後賦予乙個新值
child.prototype =
newf()
;將gnaij改變的constructor指向改回原來的指向
child.prototype.constructor = child
拷貝繼承
function
extend2
(child, parent)
c.uber = p;}拷貝
let chinese =]}
let doctor =
淺拷貝讓doctor繼承chinese
function
copy
(p);
//建立乙個空物件(容器)
for(
let i in p)
return c//返回空物件
} doctor =
copy
(chinese)
doctor.bb.
push(12
) console.
log(chinese.bb)
;//1,2,3,4,12
console.
log(doctor.bb)
;//1,2,3,4,12
修改子物件會對父物件產生影響;
深拷貝 function
copy2
(p, c)
;for
(let i in p)
copy2
(p[i]
, c[i])}
else
}return c
}doctor=
copy2
(chinese)
; doctor.bb.
push(12
)alert
(doctor.bb)
;//1,2,3,4,12
alert
(chinese.bb)
;//1,2,3,4
修改子物件不會對父物件產生影響。
js物件導向
物件導向是相對於面向過程而提出的程式設計思想 核心在於通過這種方法的設計出來的程式不再是機械的按照設定的步驟去執行,而是按照需要的步驟去執行。舉個例子 乙個人要吃飯,如果用的面向過程的話就必須執行吃飯前的一切行為,而物件導向則可以跳過之前的環節!建構函式 所謂的工廠方式 用來構造抽象物件,通過呼叫建...
js物件導向
js物件導向 一 什麼是物件 物件可以看成乙個屬性的集合。對像一般有屬性和方法構成,方法的實質是函式,而屬性的實質是變數。二 什麼是物件導向 物件導向可以理解為不需要去了解對像的內部結構,就可以使用它。像我們的date 對像的方法可以獲取和設定時間,但我們並不了解其內部原理。三 物件導向 抽風機 抽...
JS物件導向
一 js物件導向 js是一門指令碼語言,不是物件導向的語言,它沒有類的概念,有物件的概念。物件導向程式設計 oop 和面向過程程式設計 opp 的區別 面向過程以 事件為中心,將完成整個事件拆分成若干個步驟,按照步驟依次執行。物件導向以 事物為中心,完成某個需求需要哪些事物參與,側重點在於每個事物的...