工厂方式:构造函数
当new去调用一个函数,这个时候函数中的this就是创建出来的对象,而且函数的返回值直接就是this(隐式返回)

var a=[1,2,3];
var b=a;
b=[1,2,3,4]; //只要是赋值,必然要在内存中重新生成
//b=[1,2,3,4]; a=[1,2,3];

基本类型的比较:只要值相同就是true
引用类型的比较:必须值和引用都相同

原型:去改写对象下面公用的方法或属性,让公用的方法或属性在内存中存在一份(提高性能)

this:事件或定时器的时候特别容易出问题,尽量让面向对象中的this指向对象

包装对象:基本类型都有自己对应的包装对象:String Number Boolean
var str=’hello’;
str.charAt(0); //基本类型会找到对应的包装对象类型,然后包装对象类型会把所有的属性和方法给了基本类型,然后包装对象消失

原型链的最外层是Object.prototype
constructor:查看对象的构造函数
[].constructor==Array;

1.
function Aaa(){
}
Aaa.prototype.name = ‘小明’;
Aaa.prototype.age = 20;
var a1 = new Aaa();
alert( a1.constructor ); //Aaa

2.
function Aaa(){
}
Aaa.prototype = {
//constructor : Aaa,
name : ‘小明’,
age : 20
};
var a1 = new Aaa();
alert( a1.constructor );//Object,因为这样是对prototype重新赋值了,正确写法应该添加constructor : Aaa,

for-in找不到系统自动生成的属性

instanceof:对象与构造函数在原型链上是否有关系

function Aaa(){
}
var a1=new Aaa();
a1 instanceof Aaa;//true

toString():系统对象下面都是自带的,自己写的对象都是通过原型链找Object下面的。
toString():把对象转成字符串,可以进制转换。
num.toString(16);//转成16进制

Object.prototype.toString.call();

继承:子类不影响父类,子类可以继承父类的一些功能(代码复用)
属性的继承:调用父类的狗仔函数call
方法的继承:for-in:拷贝继承(jq也是采用拷贝继承)

函数也是对象,但是函数只能复制,不能被修改,所以不会产生引用类型的一些问题

1.拷贝继承:通用型,有new或无new都可以

function CreatePerson(name,sex){   //父类
    this.name = name;
    this.sex = sex;
}
CreatePerson.prototype.showName = function(){
    alert( this.name );
};

var p1 = new CreatePerson('小明','男');
//p1.showName();


function CreateStar(name,sex,job){  //子类
    
    CreatePerson.call(this,name,sex);
    
    this.job = job;
    
}

//CreateStar.prototype = CreatePerson.prototype;

extend( CreateStar.prototype , CreatePerson.prototype );

CreateStar.prototype.showJob = function(){
};

var p2 = new CreateStar('黄晓明','男','演员');

p2.showName();

function extend(obj1,obj2){
    for(var attr in obj2){
        obj1[attr] = obj2[attr];
    }
}

 
2.类式继承:利用构造函数(类),继承的方式,适合new构造函数
类:JS是没有类的概念的,把JS中的构造函数看做是类

function Aaa(){   //父类
    this.name = [1,2,3];
}	
Aaa.prototype.showName = function(){
    alert( this.name );
};

function Bbb(){   //子类
    
    Aaa.call(this);
    
}
//Bbb.prototype = new Aaa(); 最直接的方法,但是会产生一系列问题

var F = function(){};
F.prototype = Aaa.prototype;
Bbb.prototype = new F();
Bbb.prototype.constructor = Bbb; //修正指向问题

var b1 = new Bbb();

b1.name.push(4);

var b2 = new Bbb();

alert( b2.name );

3.原型继承:借助原型来实现对象继承对象,适合无new的对象

var a = {
    name : '小明'
};

var b = cloneObj(a);

b.name = '小强';

//alert( b.name );
alert( a.name );

function cloneObj(obj){
    var F = function(){};
    F.prototype = obj;
    return new F();
}