原型,原型链,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();

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