A. javaScript 中的 prototype
本文介绍 JavaScript 中的 prototype。对象与类的实例等价。
[[Prototype]] 与 prototype
[[Prototype]] 与 prototype 有别:[[Prototype]] 是内部属性,不能通过对象.属性获取;通过对象.__proto__ 可获取。prototype 是一般属性,可直接通过对象.prototype 获取。
每个对象具备 [[Prototype]] 属性。数组与函数通过 new 关键字创建,本质是对象,也拥有 [[Prototype]]。
使用 typeof 检测类标识符,返回 'function'。类是函数,函数是对象,因此类也是对象。函数与类既有 [[Prototype]] 属性,也有 prototype 属性。例外如 Proxy,无 prototype。原型链 prototype chain
最简单原型链:toString、valueOf 在 Object.prototype 上定义。
复杂原型链:Person 是类,即构造函数,是 Function 的实例。另一条原型链:Function 是类,Object、Array 等是 Function 的实例。
继承原型链:Object、Array、Function、String、Date 等类,皆有 [[Prototype]] 和 prototype。作为构造函数,它们与 Person 类相同,都是 Function 的实例。call、apply、bind 等方法定义在 Function.prototype 上。
Object、Array 等作为对象,可定义方法。静态方法如 Object.defineProperty()、Object.assign()、Array.from() 定义在 Object、Array 上。
数组原型链:数组的 push、shift、indexOf 等方法在 Array.prototype 上定义。数组与数组对象都能使用 Array.prototype 方法,以及 Object.prototype 方法,但除此之外无其他可用方法。
数组与 Function、Object 的关系:数组使用自身与 Function、Object 的方法,无需额外引入。
B. javascript中什么是 对象 什么是 对象 什么是构造函数 什么是方法呀 好纠结 不懂
这些概念要慢慢理解,不是一下子就转过来的。
C语言是面向过程的,javascript是基于对象的,两者有根本的差别,虽然语法很像
先讲下面向对象跟面向过程(javascript不是面向对象,是基于对象,但跟面向对象概念差不多的)
面向过程就是函数调用函数这样子完成一个功能。
你最熟悉的C语言,只要一写程序,就有一个main函数,其它函数都是辅助的,只有在main里调用到才会运行
面向对象就是你要完成一个功能,就要先构造一个对象,再用这个对象的方法(就是函数)去完成功能
比如浏览器里顶级对象就是window。js里常用的那些方法如alert,setTimeout,confirm等都是window的方法,你可以用window.alert调用,也可以直接调用,直接调用的时候它还是调用到window.alert上面的
1、什么是对象
对象就是东西,js中最基本的东西是内置的object
对象可以有方法,可以有属性
2、构造函数 是创建对象时初始化对象 的函数,就好比对象工厂,用于规定对象的基本属性和方法。
3、属性和方法 属性就是对象的特点,比如一张桌子有四条腿,一个面。
可以这样声明 var table={} //定义对象时{}和new Object()一样
table.legsNum=4 //桌子有四条腿
方法就是对象的功能
桌子可以用来吃饭
table.forEat=function(){alert("我在吃饭")}
C. 请教解释一个关于javascript中this的函数。
“通俗易懂些”说说我的理解。
js函数是一种对象。
new关键字可以将一个函数对象实例化为一个新的对象。
被实例化后,源对象内的this将指向这个新的对象,否则如没有用new实例化则this指向默认的顶层对象window。
如Test()和new Test()两者的区别:前者仅仅执行一次,this指向window,后者不仅执行一次而且返回一个新的对象,实例化进行时其this指向一个空的对象(在内存中),还没给在个this所指对象添加aa属性时alert(this.aa)是undefined。this.aa = 22; 给了这个对象增加了aa属性,所以第二个alert(this.aa); 弹出22;
函数内var aa=33; 这个aa!=this.aa,而且aa!=window.aa, 所以alert(aa) 弹出33;
最后alert(new Test().aa); (new Test())这个匿名对象已经有了aa属性,值为22,所以最后弹出22