面试前端基础必备

js中的this call apply bind

var a = {
    a: 'haha',
    getA: function () {
        console.log(this.a);
    }
};
var b = {
    a: 'hello'
};

var getA = a.getA;
var getA2 = getA.bind(a);

function run (fn) {
    fn();
}

//一下分别输出
a.getA();//haha
//this指向当前调用函数的对象a
getA();//a 对象
//当前的this指向全局this,一般遇到这样的函数调用,fn()=this.fn(),当前this指向全局
run(a.getA);//a 对象
//这里 fn = a.getA = a对象中getA这个函数,fn()this指向全局。所以 a对象
getA2.call(b);// 'haha'
//call(b)幌子。getA.bind(a) 'haha'

原型

function clone(obj) {
    //实现
}

var a = {name:'a'};
var b = clone(a);

//完善实现中部分,让一下代码成立

console.log(b.name)//'a'

a.name = 'a1';
console.log(b.name)//'a1'

b.name = 'b';
console.log(b.name)//'b'
console.log(a.name)//'a1'

a.name = 'a2';
console.log(b.name)//'b'

//当b没有值时,b的值是a的值,当b被赋值,ab的值互不影响

第一种答案

function clone(obj){
    return Object.create(obj);
}

第二种答案

function clone(obj){
    function fn(){};
    fn.prototype = obj
    return new fn();
}

第三种答案

function clone(obj) {
    var ret = {};
    ret.__proto__ = obj;//__proto__并不是所有浏览器都支持
    return ret;
}

你可能感兴趣的:(javascript)