今天來說一下js物件導向的小練習,廢話不多說直接上練習,如果你能做出這個練習,說明你對js物件的一些知識已經很清晰了
一、**
function
foo();
return this;
}foo.getname = function
();foo.
prototype.getname=function
() ;
var getname = function
();function
getname
()// 寫出下面的結果
// 1 foo.getname();
// 2 getname();
// 3 foo().getname();
// 4 new foo.getname();
// 5 new foo().getname();
// 6 new new foo().getname();
怎麼樣你已經知道答案了麼?
二、具體分析
1.foo.getname(); 結果 彈出 2
分析:這個應該很簡單,直接執行foo.getname 函式表示式。
2.getname(); 結果 4 ,這個不難
分析:這裡有一些知識點,我來詳細的說一下,
① 當變數名字(沒有賦值的情況下)和 函式名相同時,優先讀取函式,也就是:
var getname
function
getname
()getname
();//結果會是5
3.foo().getname(); 結果 1
這一塊知識點比較多,我們來慢慢分析。
foo() 函式執行完時,因為foo()函式中返回了this, 當執行完時,foo函式內的資料就暴露在了全域性環境下,所以 返回的this 也就是foo()指的是window,
那麼你可能會說 在window下getname 函式有兩個呀
getname = function
();var getname = function
();
為啥不彈出 4, 原因在於var宣告的變數被提公升了,而 沒有用var宣告的變數沒有被提公升(屬於全域性變數),其次,函式中如果用var 宣告的變數,它的作用域是在函式內的,這裡沒有用var 宣告getname 函式表示式,所以foo().getname() 結果為1 ;
4.new foo.getname(); 結果 2
這個結果不知道你有沒有想對,對於這個結果首先我們需要知道 new 操作符背後做了些什麼。可以看一看我以前的文章
其實在用new 操作符建立物件時,它背後給我們做的一些工作類似於:
var obj1= (function
(); //建立乙個新物件
o.__proto__=obj.prototype; //將新物件的原型鏈指向obj的原型
obj.call(o,"hello") //執行obj函式,將o物件指標指向obj函式,及o擁有了obj原型的屬性和方法(引用)
return o;
})()
這裡new 出來的建構函式,會繼承例項的原型上邊的所有屬性和方法。②這裡生成的建構函式是foo.getname
的建構函式,如果你不信,可以自己手動為foo.getname的原型新增乙個屬性或方法(例如: foo.getname.prototype.name = 4;),然後讓後利用建立的建構函式去訪問。
var ac =
new foo.getname();
console.
log(ac.name) // 4
5.new foo().getname(); 結果是 3;
如果你上邊的結果看懂了,那麼這個你將很容易明白。這裡和上邊的唯一區別就是 函式 foo 加了括號,這這個區別就改變了建構函式的例項,上邊構造出來的函式的例項是foo.getname
,而這個建構函式的例項是foo
函式。
這裡new foo().getname();
的寫法 其實就相當於:
var a = new foo();
a.getname();
關於javaSE物件導向的一些小知識
一 物件導向 1 物件導向 是基於面向過程的一種思想。面向過程 以函式為基礎,關注實現過程,強調功能行為。物件導向 以物件為基礎,關注實現結果,強調具備了功能的物件。2,物件導向的思想特點 a 是一種更符合人們思考習慣的思想 b 把複雜的事情簡單化 c 把我們從執行者變成了指揮者。封裝 繼承多型 3...
7 15的一些小練習
使用turtle庫,繪製乙個八邊形。圖形如下所示 import turtle as t t.setup 800,600 t.pensize 5 t.seth 22.5 t.pencolor black t.circle 80,steps 8 t.done 使用turtle庫,繪製乙個八角圖形。圖形如...
php物件導向程式設計的一些小問題
1 empty檢查物件屬性是否為空 有這樣乙個類 class cytest private val function construct val this val val function get name return this name function getv return this val...