JS高級
關於string,number是大寫,那麽就是構造函數,變量不可能為null值,除非手動設置,要解除對象的引用的時候手動去除。
in關鍵字操作數組的時候操作的是索引值,不是裏面的內容,。在操作對象的時候操作的是鍵值對的鍵。
var arr = [4,2,,5,7] console.log(4 in arr);這裏指的是索引為4的是否存在於數組中,返回的是boolean類型
var boo = {name:"張三",age:"18"} var k in boo遍歷的是name和age
值類型和引用類型:
值類型的賦值:直接將存儲的數據復制一份進行賦值,兩份數據在內存中是完全獨立的。
引用類型的賦值:兩個對象共用一個地址,其中一個修改數據,也會在另外一個上面體現出來
註意值類型和引用類型做函數的參數的情況:
1.值類型做形參,在函數內部通過形參修改值,不會影響外部變量的值。
2.引用類型做形參,也是把外部實參的內存地址賦值給了形參,在函數內部,形參同樣指向該對象,所以在函數內部對形參進行修改,也會影響到外面的變量,但是值得註意的是
如果是在函數內部重新創建出了一個和形參一樣的對象,那麽這兩個對象之間不再有關系,修改其中一個,另外一個不受影響。
delete關鍵字:可以用來刪除對象的屬性。還有未使用var聲明的變量。使用var聲明的變量是不能夠被刪除的。可以接受返回值,是一個bool類型,表示刪除是否成功。
//繼承:
//javaScript當中的繼承是指
//一個對象沒有一些方法和屬性,但是另外一個對象有
//把另外一個對象的屬性和方法,拿過來使用,就是繼承
var obj = {};
var obj1 = {
name : "張學友",
sayHello: function () {
console.log("你好,我是張學友");
}
}
// obj.sayHello();
//混入式繼承(mix-in) for in 用for in把obj1的每個屬性方法同樣設置給obj,但是要使用[ ]這樣的形式,不能使用obj.k = obj1.k這樣的形式
for(var k in obj1){
//k可以獲取到對象的每一個屬性
//obj1[k]可以獲取到對象的每一個屬性的值
//這裏使用k給對象新增屬性的時候,不可以使用點語法
obj[k] = obj1[k];
}
obj.sayHello();
創建對象的方式:
1 對象字面量的方式:
//只能創建一次對象,復用性較差,如果要創建多個對象,代碼冗余度太高 // var obj = { // name:"演員", // singer:"薛段子手", // type:"流行" // }; // // var obj1 ={ // name:"吻別", // singer:"張學友", // type:"流行" // }
2.使用內置構造函數 // var obj = new Object(); // // obj.name = "一千個傷心的母牛"; // obj.singer = "張學友"; // obj.sing = function () { // console.log("一千個傷心的母牛"); // }
//3.封裝簡單的工廠函數 (不推薦使用了),在函數內部使用內置構造函數在返回,傳入不同的實參可以給不同的對象獲得不同的屬性或者方法。
function createSong(songName,singerName){
var o =new Object();
o.name = songName;
o.singer = singerName;
o.sing = function () {
console.log("讓我來唱首歌");
}
return o;//{name:"",singer:"",sing:function...}
}
var obj = createSong("演員","薛之謙");
var obj1 = createSong("一言難盡","張宇");
自定義構造函數
//構造函數名,首字母要大寫!!!以示區分
function Person() {
//默認隱含的操作,把剛才用new新創建出來的對象賦值給this
this.name = "尼古拉斯凱奇";
this.age = 50;
this.sayHello = function () {
console.log("Hey man");
}
//如果這裏寫其他的代碼,會執行嗎? 肯定會
return null;
}
var p = new Person();//new Object();
console.log(p);
p.sayHello();
//構造函數的執行過程
//1.使用new關鍵字創建對象
//2.調用構造函數,把新創建出來的對象賦值給構造函數內的this
//3.在構造函數內使用this為新創建出來的對象新增成員
//4.默認返回新創建的這個對象 (普通的函數,如果不寫返回語句,會返回undefined)
//構造函數的返回值
//1.如果不寫返回值,默認返回的是新創建出來的對象 (一般都不會去寫這個return語句)
//2.如果我們自己寫return語句 return的是空值(return;),或者是基本類型的值或者null,都會默認返回新創建出來的對象
//3.如果返回的是object類型的值,將不會返回剛才新創建的對象,取而代之的是return後面的值
var obj1 = {
name : "張學友",
sayHello: function () {
console.log("你好,我是張學友");
}
}
原型:
//在構造函數創建出來的時候,系統會默認的幫構造函數創建並關聯一個神秘的對象,這個對象就是原型
//原型默認的是一個空的對象
//原型的作用
//原型中的屬性和方法 可以被使用該構造函數創建出來的對象 使用
//當使用對象去訪問屬性和方法的時候
//會首先在對象自己內部進行查找,如果找到了,就直接使用
//如果沒有找到,就去原型中查找,查找到之後,使用
//如果原型中還沒有, 如果是屬性,就是Undefined
//如果是方法,就報錯
//如何使用原型來解決構造函數存在的問題?
//構造函數的原型對象中的成員,可以被該構造函數創建出來的所有對象訪問
//而且,所有的對象共享該原型對象
//所以,我們可以將構造函數中需要創建的函數,放到原型對象中存儲
//這樣就解決 全局變量汙染的問題 以及 代碼結構混亂的問題
//實例化://通過構造函數創建對象的過程 就叫做實例化 //通過構造函數實例化出來的對象就是該構造函數的一個實例 //說實例的時候,一定要指定好構造函數 某某某 是 某某某構造函數的實例
//原型的使用方法
//1.利用對象的動態特性給原型對象添加成員 當我們需要動態創建的函數不多的時候用這樣的方式
//2.直接替換原型對象 當我們需要創建的函數太多的時候,就用這樣的方式
//在替換原型之前創建的對象的原型 和 在替換原型對象之後的創建的對象
//的原型 不是同一個!
JS高級