this_原型链_继承

花落谁家.

apply、call 、bind 作用&区别

<pre>
//语法
apply:| fun.apply(thisArg, [argsArray])
call:| fun.call(thisArg[, arg1[, arg2[, ...]]])
bind:| fun.bind(thisArg[, arg1[, arg2[, ...]]])
</pre>

  1. apply & call作用:>本质都是改变函数的执行环境上下文,即this指向。区别:>是apply的参数是传入数组或类数组,而call的参数是若干个指定参数。

<pre>
var hobby = 'sleep'
var 小强 = { hobby: 'play' }
var 小明 = { hobby : 'eat' }
function yourhobby(){ console.log(this.hobby) }
yourhobby() // >sleep< this指向window yourhobby.call(小强) // >play< this指向小强 yourhobby.apply(小明) // >eat< this指向小明
</pre>

<pre>
var _array = [6, 2, 2, 6, 9, 3, 2, 9, 0] Math.min.apply(null,_array) // >0< 可直接处理数组 Math.max.call(null,6, 2, 2, 6, 9, 3, 2, 9, 0) // >9< 需要一一键出
</pre>

bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。

<pre>
this.x = 9; var module = { x: 81, getX: function() { return this.x; } };

module.getX(); // 返回 81

var retrieveX = module.getX; retrieveX(); // 返回 9, 在这种情况下,"this"指向全局作用域

// 创建一个新函数,将"this"绑定到module对象 // 新手可能会被全局的x变量和module里的属性x所迷惑 var boundGetX = retrieveX.bind(module); boundGetX(); // 返回 81
</pre>

| Bind | Call | Apply | 参考~


以下代码输出什么?

<pre>
var john = { firstName: "John" } function func() { alert(this.firstName + ": hi!") } john.sayHi = func // 为john 增一sayHi属性,并赋其func方法 john.sayHi() // John hi!
</pre>

下面代码输出什么,为什么

<pre>
func() function func() { alert(this) // [object Window] }
//因为this指向 window 所以打印出 window 对象
</pre>

下面代码输出什么

<pre>
document.addEventListener('click', function(e){ console.log(this); // 指向/打印 文档 setTimeout(function(){ console.log(this); // 指向/打印 window }, 200); }, false);
//由setTimeout()调用的代码运行在与所在函数完全分离的执行环境上. //这会导致,这些代码中包含的 this 关键字会指向 window (或全局)对象, //这和所期望的this的值是不一样的
</pre>

下面代码输出什么,why

<pre>
var john = { firstName: "John" } function func() { alert( this.firstName ) } func.call(john) // 打印 > John
// call 使this指向 john 对象..
</pre>

以下代码有什么问题,如何修改

<pre>
`var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) // this指向eventTarget,在此即被点击的DOM元素($btn)
this.showMsg(); // this 指向的 Dom 元素 无此函数0.0无法运行
})
},

showMsg: function(){
console.log('checked~');
}
}</pre><pre>var module= {
bind: function(){
var _this = this // 把this保存起来
$btn.on('click', function(){
console.log(this) // > $btn Dom按钮
_this.showMsg(); // 触发下面方法
})
},
showMsg: function(){
console.log('checked~~~');
}
}`
</pre>


原型链相关问题

有如下代码,解释Person、 prototype、proto、p、constructor之间的关联。

<pre>
function Person(name){ this.name = name; } Person.prototype.sayName = function(){ console.log('My name is :' + this.name); } var p = new Person("小明") p.sayName(); // Analyze... console.dir( rel = [ Person.prototype.constructor == Person, Person.prototype == p.__proto__, p.__proto__.constructor == Person, Person.prototype.__proto__ == Object.prototype, Object.prototype.constructor == Object, Object.prototype.__proto__ == null ] );</pre>

动手0.0

上例中,对对象 p可以这样调用 p.toString()。toString是哪里来的? 画出原型图?并解释什么是原型链。

p本身无此方法..该方法是因构造函数的 __proto__ 指向对象原型.所以从对象原型中继承而来。

使用一个构造函数创造一个实例对象,在此对象上调用相应的属性和方法时,首先查找它本身有没有,如果没有,则顺着proto这个指针去找它的构造函数的原型上有没有,如果没有,再顺着原型的proto向上去找,也就是说,只要存在proto这个指针,在没有找到对应的属性与方法时,查找不会停下,直到没有proto为止,这样的一种形式可行的结构基础就叫原型链

一直找

对String做扩展,实现如下方式获取字符串中频率最高的字符

<pre>
//var str = 'ahbbccdeddddfg'; //var ch = str.getMostOften(); //console.log(ch); //d , 因为d 出现了5次
//|||||||||||||||||||||||||||||||||
<script> String.prototype.getMostOften = function(){ var _this = this var obj = {} for(var i=0; i<_this.length; i++){//循环这个字符串 if(obj[_this[i]]){ obj[_this[i]]++ } else { obj[_this[i]] = 1 } } var maxNum = 0, maxKey for (var key in obj) { if(obj[key] > maxNum) { maxNum = obj[key] maxKey = key } } return { maxKey, maxNum } } var str = 'adbabisbvibibqdasxcz'; var ch = str.getMostOften() console.log(ch) </script>
//结果返回: Object maxKey:"b" maxNum:5
</pre>

instanceof有什么作用?内部逻辑是如何实现的?

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

语法:object instanceof constructor

<pre>
function _instanceof(obj,fn) { var nextobj = obj.__proto__ do { if(nextobj === fn.prototype) { return true; } else { nextobj = nextobj.__proto__; } }while(nextobj) return false; }</pre>


继承相关问题

继承有什么作用?

抽象事物从一般到特殊的过程,使得更具体的事物共享那些更通用的属性与方法,减少重复,通常我们将更具体的事物称为子类,把抽象的事物称为父类。我们可以灵活的给子类添加特定的属性与方法以此来使其拓展父类的功能,而又不影响父类本身。

下面两种写法有什么区别?

<pre>
`//方法1
function People(name, sex){
this.name = name;
this.sex = sex;
this.printName = function(){ //通用的这一步放于此会减低复用性
console.log(this.name);
}
}
var p1 = new People('小强', 18)

//方法2
function Person(name, sex){
this.name = name;
this.sex = sex;
}

Person.prototype.printName = function(){ // 把通用方法放于原型链中,增加复用性。
console.log(this.name);
}
var p1 = new Person('小明', 100);`
</pre>


Object.create 有什么作用?兼容性如何?

Object.create() 方法使用指定的原型对象和其属性创建了一个新的对象。

语法: Object.create(proto, [ propertiesObject ])


hasOwnProperty有什么作用? 如何使用?

hasOwnProperty() 方法会返回一个布尔值,指示对象是否具有指定的属性作为自身(不继承)属性。

语法: obj.hasOwnProperty(prop=要检测的值)

<pre>
o = new Object(); o.prop = 'exists'; o.hasOwnProperty('prop'); // 返回 true o.hasOwnProperty('toString'); // 返回 false o.hasOwnProperty('hasOwnProperty'); // 返回 false
</pre>

如下代码中call的作用是什么?

<pre>
function Person(name, sex){ this.name = name; this.sex = sex; } function Male(name, sex, age){ Person.call(this, name, sex); // Male下执行Person,call 使Person构造函数在此作用域下能够访问并继承 Person 的属性. this.age = age; }
</pre>

补全代码,实现继承

<pre>
`function Person(name, sex){
// todo ...
this.name = name;
this.sex = sex;
}

Person.prototype.getName = function(){
// todo ...
console.log('My name is ' + this.name)
};

function Male(name, sex, age){
//todo ...
Person.call(this, name, sex)
this.age = age;
}

Male.prototype = Object.create(Person.prototype);
Object.create(Person.prototype).construtor = Male

//todo ...
Male.prototype.getAge = function(){
console.log(this.name);
};

var xiaom = new Male('小明', '男', 18);
xiaom.getName();`
</pre>


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容