函数,对象,原型链

//		function People(name,age){
// return {
// name:name,
// age:age,
// eat:function(){
// alert(5)
// }
// }
// }

//
// function People(a,b){
// this.name=a;
// this.age=b;
// }
// People.prototype.eat = function(){
// alert(1);
// }
// var people1 = new People('sss',51);
// var people2 = new People('jfj',12);
//// console.log(people2.eat)
//// console.log(people1)
// console.log(people1.eat===people2.eat)

// var people1 = new People('df',6541)
// console.log(people1.__proto__.constructor.__proto__.constructor)
// 上面这句话的执行步骤
// 1:在内存汇总生成一个空对象 people1;
// 2:这个实例对象有一个默认的属性_proto_被构造函数的prototype所赋值,也就是说people1.__proto__和People.prototype指的是同一个对象
// 3:运行构造函数People,同时调用call方法,改变构造函数的this指向
// 4:检查构造函数的返回值,如果返回值是基本数据类型,则无视返回值,而是将生成的对象给返回出来,如果说是引用数据类型,那么将返回值返回,如果是空对象null,那么也会被扔掉
//
// prototype 与 _ptoto_之间的关系:
// 首先,对象都是函数创建的. var obj = {} 其实是 var obj = new Object();
// 每个函数都会有prototype属性,对象没有这个属性,构造函数的prototype属性指向另一个对象,称之为原型对象.
// 对象有_ptoto_属性,被称为隐式原型
// 因为函数是对象,所以也有_ptoto_;
// 函数都是 var aow = new Function();
// 每个对象的_ptoto_属性指向创建这个对象的构造函数的ptototype;
// Object.ptototype._ptoto_指向null;
// 以免造成死循环.

// 原型链:
// 访问一个对象的属性时,现在本地属性中查找,如果没有,再沿着_ptoto_这条链向上找,就是原型链

// 详解this
// 首先记住分清几点;
// 1 this这个关键字,在函数运行的时候才会被指定
// 2 构造函数的首字母要大写
// 3 函数本身扮演两个角色,一个是对象,一个是函数,并且函数都是由Function创建的
//
// this基本上有五种情况:
// 1 在构造函数里(有new 出来新对象的情况下)
// 此时构造函数里的this指向新构建出来的对象
// 2 函数作为对象的一个属性的话
// 函数里面的this指向的就是该对象
// 3 用call()或者apply()方法调用的话
// 当函数被call()或者apply()调用时,函数中的this指向call(),apply()传入的对象
// call和apply都是为了改变某个函数运行时的context,即上下文环境而存在的.
// 换句话说,就是为了改变函数内部的this指向的,二者作用完全一样,只是传参的方式不一样
// Fn.call(obj,arg1,arg2,arg3,arg4……)
// Fn.apply(obj,[arg1,arg2,arg3,arg4……])
// apply是以数组的形式进行传参,call是以单个的形式进行传参
//
// 4 当函数是全局或普通函数时.
// 就是传说中的谁调用我,我指向谁

// 5 在prototype原型对象中,this指向的是调用构造函数,实例化出来的新对象.

//面向对象的第二个特征 继承
// function People(){
// this.type = '人类'
// }
// function Man(name){
// this.name = name
// }
//
// Man.prototype = new People();
// Man.prototype.constructor = Man;
// var man1 = new Man('张三');
// console.log(Man.prototype.constructor)
// console.log(man1.type)

// 最好的继承方式,利用空对象做中介,需要提示,空对象几乎不占内存

// function People(){}
// People.prototype.type = '人类';
// function Man(name){
// this.name = name ;
// }
// Man.prototype = new People();
// Man.prototype.constructor = Man;
// var aaa = new Man('hanmei');
// console.log(aaa.type)

// 对象的第三个特征 多态
// 一个引用类型(变量)在不同情况下的多种状态
// js本身就是无态的,天生就支持多态.

猜你喜欢

转载自blog.csdn.net/yijiupingfan0914/article/details/80047767