原型,原型鏈,call/apply

原型prototype    ---祖先                
1.定義:原型是function對象的一個屬性,它定義了構造函數製造出的對象的公共祖先。通過該構造函數產生的對象,可以繼承該原型的屬性和方法。原型也是對象。
2.利用原型特點和概念,可以提取共有屬性。
3.對象如何查看原型-->隱式屬性__proto__,指向原型
4.對象如何查看對象的構造函數-->原型裏的隱式屬性constructor 構造器

//Person.prototype   --祖先
//Person.prototype = {} 原型
//原型和隱式屬性constructor __proto__ 的屬性都可以手動更改

Person.prototype.name = 'sunny';
function Person() {
	//var this = {
	//	__proto__: Person.prototype
	//}
}
var person = new Person();
Person.prototype = {//這裏改的是new的空間
	name : 'cherry'
}
//寫在new後面,此時的person.name是"sunny"
//var obj = {name : "a"};
//var obj1 = obj;
//obj = {name : "b"};
Person.prototype = {name : "a"};
__proto__ = Person.prototype;
Person.prototype = {name : "b"};
原型鏈
1.如何構成原型鏈?
2.原型鏈上屬性的增刪改查
3.絕大多數對象的最終都會繼承自 Object.prototype
4.Object.create(原型);

//a.sayName() sayName裏面的this指向是,誰調用的這個方法,this就指向誰
//Person.prototype.__proto__ = Object.prototype//所有對象的最終原型
Person.prototype = {
	name : "a",
	sayname : function () {
		console.log(this.name);
	}
}
function Person() {
	this.name = "b";
}
var person = new Person();
console.log(person.sayName());//b
console.log(Person.prototype.sayName());//a
//var obj = Object.create(原型);
var obj = {name : "sunny", age : 123};
var obj1 = Object.create(obj);
//obj1的原型就是obj
Person.prototype.name = "sunny";
function Person() {
}
var person = Object.create(Person.prototype);
//person的原型就是Person.prototype
//Object.create(null);構造了一個沒有原型的對象,沒有原型手動加原型屬性沒用
var num = 123;
//num.toString(); --> new Number(num).toString();
Number.prototype.toString = function() {
}
// Number.prototype.__proto__ = Object.prototype
// Object.prototype.toString = function() {
//
// }
// 同樣的名字,不同的功能被覆蓋,就叫做重寫
// Object.prototype自帶toString方法
// Object.prototype.toString = function() {
//
// }
Person.prototype = {
	toString : function() {
		return 'hehe';
	}
}
function Person() {
}
var person = new Person();
//此處重寫了Object的toString,訪問 person.toString 返回 'hehe'
var obj = Object.create(null);
obj.toString = function() {
	return 'abc';
}
document.write(obj);
//調用沒有原型的obj,手動給obj加toString方法,return 'abc',打印obj返回'abc'
小知識點
小bug 0.14*100 = 14.000000000000002,小數點計算時,計算不精準
Math. ceil(123.234)向上取整math.ceil(x)返回大於參數x的最小整數,即對浮點數向上取整
Math. floor(123.234)向下取整
Math. random()產生0到1之間的隨機數
toFixed(2)保留2位小數,並且四捨五入

js可正常計算數字前16位後16位

for(var i = 0; i < 10; i++) {
	var num = Math.floor(Math.random() * 100);
	console.log(num);
}
//先乘以一百,再取整,產生十個0到100的隨機整數
call/apply
1.作用,改變this指向。
2.區別,後面的參數形式不同。
//call 需要把實參按照形參的個數傳進去,Person.call(obj, 'cheng', 300);
//apply 必須傳一個數組arguments,Person.apply(obj, ['cheng', 300]);

function Person(name,age){
	    //this == obj
	    this.name = name;
	    this.age = age
	}
	var person = new Person('deng' , 100);
	var obj = {}
	Person.call(obj, 'cheng', 300);//改變this爲call的第一個參數,把 Person裏面的this都換成了obj
	// test(); ==>     test.call();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章