in(运算符):判断一个对象或变量是属于某一个对象(无论对象是否是原型对象)
hasowenproperty:判断一个对象或变量是属于某一个对象((不包含父级的原型对象)

继承的实现
所有开发者定义的类都可作为基类(父类)
出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码,因为
这些代码可以被用于恶意攻击
创建的子类将继承超类的所有属性和方法,包括构造函数及方法的实现所有属性和方法都是公用的,因此
子类可直接访问这些方法。子类还可添加超类中没有的新属性和方法,也可以覆盖超类的属性和方法
var obj = new object();
obj.color = "blue";
function sayColor(sPrefix, sSuffix) {
alert(sPrefix + this.color + sSuffix);
};
sayColor.call(obj, "The color is ", " a very nice color indeed. ");
sayColor.apply(obj,new Array("the color is","a very nice color indeed."));
bind()方法的主要作用就是将函数绑定至某个对象,bind()方法会创建一个函数,函数体内this对象的值
会被绑定到传入bind()函数的值。
function.prototype.bind(thisArg[,arg1[,arg2[,...]]])
实例:
var A = function(name) {
this.name = name;
}
var B = function() {
A.bind(this,arguments);
}
B.prototype.getName = function() {
return this.name;
}
var b = new B("hello");
console.log(b.getName());
bind,call,apply区别:
共同点:都可以改变函数执行的上下文环境;从而改变this的指向
不同: bind:不立即执行函数,一般用在异步调用和事件; call/apply:立即执行函数。使用语法也不同
构造函数继承:
function classA(sColor) {
this.color = scolor;
this.saycolor = function () {
alert(this.color);
};
}
function classB( bColor,bName) {
this.newMethod = classA;
this.newMethod(bcolor);
delete this.newMethod ;
this.name = bName;
this.sayName = function () {
alert(this.name) ;
};
}

原型链继承弊端:
原型链的弊端是不支持多重继承。
原型链会用另一类型的对象重写类的prototype属性。
实例:
function classA() {}
ClassA.prototype.color = "blue";
ClassA.prototype. saycolor = function () {
alert(this.color);
};
function classB() {}
classB.prototype = new ClassA();
var objA = new classA();
var objB = new ClassB();
objA.color = "blue";
objB.color = "red";
objA.sayColor();
objB.sayColor();
寄生式继承:
function object(o){
function F(){}
F.prototype=o;
return new F();
};
function createAnother(original){
var clone = object(original);
clone. sayHi = function(){
alert( "hi");
}
return clone;
}
寄生式继承:把原型对象封装到一个方法,并返回新的原型对象return new原型对象,继承时,
调用父对象,并且可以向调用后生成新对象里添加属性和方法(继承原理)
function classA( scolor) {
this.color = sColor;
}
ClassA.prototype. saycolor = function () {
alert(this.color);
};
function classB(scolor, sName) {
classA.call(this,scolor);
this.name = sName;
}
classB.prototype = new classA( );
classB.prototype. sayName = function () {
alert(this.name ) ;
};
