浓缩解读前端系列书籍一周一章前端书

一周一章前端书·第10周:《你不知道的JavaScript(上)

2018-01-07  本文已影响6人  梁同学de自言自语

第5章 :原型

5.1 [[Prototype]]

//举例:创建一个myObj对象,然后读取其属性值
var myObj = {
    a : 2
};
myObj.a;    // 2
var anotherObj = {
    a : 2
}
// Object.create()方法是根据传入的对象,创建一个新对象,并且原型链上关联到传入的对象
var myObj = Object.create(anotherObj);
myObj.a;  // 2
5.1.1 object.prototype
5.1.2 属性设置和屏蔽
myObj.foo = 'bar';
var anotherObj = {
    a : 2
}
//创建一个原型关联anotherObj的新对象
var myObj = Object.create(anotherObject);
//不管子对象还是父对象,a属性值都输出2
anotherObj.a;   // 2
myObjt.a;   // 2
//父对象中拥有a,而子对象中不拥有a
anotberObj.hasOwnProperty('a'); // true
myObj.hasOwnProperty('a');  //false
//执行++操作,造成隐式屏蔽
myObj.a++;
//再看发现子类自己拥有了a属性,屏蔽了原型链上的同名属性
anotherObj.a;   // 2
myObj.a;    // 3
myObj.hasOwnProperty('a');  // ture

5.2 “类”

5.2.1 “类”函数
function Foo(){
    // ...
}
var a = new Foo();
Object.getPrototypeOf(a) === Foo.prototype; // ture
关于名称
5.2.2 “构造函数”
function Foo(){
    // ...
}
Foo.prototype.constructor === Foo;  // true

var a = new Foo();
a.constructor === Foo;  // true
function NothingSpecial(){
    console.log("Don't mind me");
}

var a = new NothingSpecial(); // Don't mind me
a; // {}
5.2.3 技术
//定义一个Foo函数,函数里将this.name属性重新赋值
function Foo(name){
    this.name = name;
}
//为Foo.prototype原型对象定义一个myName()方法,返回name值
Foo.prototype.myName = function(){
    return this.name;
}
//通过new的方式调用Foo()函数,返回a、b两个对象
var a = new Foo('a');
var b = new Foo('b');
//调用a、b对象的myName()方法
a.myName(); // 'a'
b.myName(); // 'b'
回顾“构造函数”
//定义Foo函数
function Foo(){};
//将Foo的原型对象赋值为空
Foo.prototype = {};
//创建对象a
var a = new Foo();
//测试
console.log(a.constructor === Foo);    // false
console.log(a.constructor === Object);  // true 

5.3 原型继承

/**
 * ----------------------
 * 【示例:继承JS类并进行实例化】
 *  西瓜继承自水果,水果拥有type(食物类型)属性,西瓜拥有name(水果名称)属性
 * ----------------------
 */
//声明Fruit对象,并定义getType()方法
function Fruit(type){
    this.type = type;
}
Fruit.prototype.getType = function(){
    return this.type;
}
//声明WateMelon对象,继承Fruit,并拥有getName()方法
function WateMelon(type,name){
    Fruit.call(this,type);
    this.name = name;
}
//通过Object.create()来继承
WateMelon.prototype = Object.create(Fruit.prototype);
WateMelon.prototype.getName = function(){
    return this.name;
}

//创建实例
var watemelon = new WateMelon('水果','西瓜');
console.log('食物品种:',watemelon.getType());
console.log('食物名称:',watemelon.getName());

Object.setPrototypeOf(WateMelon.prototype,Fruit.prototype);
检查“类”关系
watemelon instanceof Watemelon; // true
watemelon instanceof Fruit; // true

注意:instanceof 判断的是实例对象和类的原型关联,而如果想判断两个实例对象之间是否有原型关联,则instanceof无法实现。

WateMelon.prototype.isPrototypeOf(watemelon);

注意:一定是要用原型对象调用isPrototypeOf()方法来做判断,如果用类函数(WateMelon)来调用,则返回false

Object.getPrototypeOf(watemelon) === WateMelon.prototype;   // true

5.4 对象关联

5.4.1 创建关联
if(!Object.create){
    Object.crate = function(o){
        //通过一个临时的F类,建立指定原型关系
        function F(){};
        F.prototype = o;
        return new F();
        
    }
}
5.4.2 关联关系是备用
var a = {
    echo : function(){
        console.log('hello');
    }
};

var b = Object.create(a);
b.echo();   // 'hello'
var a = {
    echo : function(){
        console.log('hello');
    }
};

var b = Object.create(a);
b.doEcho = function(){
    this.echo();
};
b.doEcho();   // 'hello'

5.5 小结

上一篇 下一篇

猜你喜欢

热点阅读