Code Monkey home page Code Monkey logo

Comments (8)

newwangyiyang avatar newwangyiyang commented on May 14, 2024

bind函数多次调用会已第一次绑定的this为准,softbind已最后一次绑定传入的this为准;

from daily-question.

miaooow avatar miaooow commented on May 14, 2024
  Function.prototype.softBind = function(obj, ...rest) {
    const fn = this
    const bound = function(...args) {
      const o = !this || this === (window || global) ? obj : this
      return fn.apply(o, [...rest, ...args])
    }

    bound.prototype = Object.create(fn.prototype)
    return bound
  }

function foo() {
console.log(name: ${this.name});
}

let obj = {name: "obj"};
obj2 = {name: "obj2"};
obj3 = {name: "obj3"};

let fooBJ = foo.softBind(obj);
fooBJ();  // name: obj   这个时候软绑定已经生效了,this绑定到obj上
obj2.foo = foo.softBind(obj);
obj2.foo(); //name: obj2   这里已经的this隐式绑定到obj2上了
fooBJ.call(obj3); // name: obj3  这里this被硬绑定到obj3上了
setTimeout(obj2.foo, 100); // name: obj  软绑定了最初的obj

from daily-question.

shfshanyue avatar shfshanyue commented on May 14, 2024

TODO

from daily-question.

shuangcherry avatar shuangcherry commented on May 14, 2024

bound.prototype = Object.create(fn.prototype); 为什么要有这一句,不是很懂

from daily-question.

shen076 avatar shen076 commented on May 14, 2024
  Function.prototype.softBind = function (obj, ...args) {
     const fn = this;
     return function (...args2) {
        return fn.apply(this === global ? obj : this, args.concat(args2));
     };
  };

from daily-question.

zhangtuo1999 avatar zhangtuo1999 commented on May 14, 2024
Function.prototype.softBind = function (ctx) {
    ctx ??= globalThis
    ctx = Object(ctx)

    const self = this
    const args = [...arguments].slice(1)

    function bound() {
        fn.call(new.target || this !== globalThis ? this : ctx, ...args)
    }

    bound.prototype = self.prototype
    return bound
}

from daily-question.

rujptw avatar rujptw commented on May 14, 2024

bound.prototype = Object.create(fn.prototype); 为什么要有这一句,不是很懂
是要考虑到new的情况来着

from daily-question.

Yeti-xxx avatar Yeti-xxx commented on May 14, 2024

实现一个Bind:

function person(a, b, c, d, e) {
    console.log(this.name, a + b + c);
    console.log(d,e);
}

const yeti = {
    name: 'yeti'
}

// 实现一个bind
Function.prototype.newmyBind = function (obj, ...args) {
    const that = this
    return function (...rest) {  //返回一个修改好this的函数
        // ...rest来自返回函数传入的参数  ...args是调用Bind时传入的参数
        that.call(obj, ...args, ...rest)
    }

}

const resBind = person.newmyBind(yeti, 1, 2, 6) //1 2 6 就是...args
resBind(5, 6)   //传入...rest

from daily-question.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.