闲聊this
面向对象方法将数据与对应的代码封装为一个整体,原则上其他对象不能直接修改其数据,即对象的修改只能由自身的成员函数完成,控制程序方式上通过“事件驱动”来激活和运行程序。
上面这段话是描述面向对象与面向过程的语言的区别,摘录至此,其中原则上只能自身的成员函数才能修改对象的数据,这句话,咋说呢,不知KVC该置于何地呀!(也不对,KVC还真是调用自己的方法来修改数据的)相对来说Java中常写的bean倒是这么回事。
函数和数据如何合并到一个整体中的
非面向对象的语言,比如c语言,数据和函数是独立的,并没有特别的联系。而面向对象的语言中,往往由类对象将数据和函数关联在一个整体,最经济的方式可能就是在原函数的参数中默认包含部分隐藏参数,
比如OC的方法中就默认包含隐藏参数id、sel
[receiver message]
objc_msgSend(receiver, selector, arg1, arg2, ...)
比如C++中类中函数第一个隐藏参数为this指针
这里的函数已经不是原来的那个函数了
可能很多人都是从面向过程的C语言入门,过度到面向对象的编程语言,
js中的this
可以这么理解,js中的函数都是由对象调用的,就算形式如foo()这样,也是window.foo()的简写形式而已
一种说法是,函数体内部使用的this,指的是函数运行时所在是环境Context。
为什么js中对象可以随意动态添加成员变量,而OC不行(分类不能添加成员变量)?
存储的结构是不一样的
以下愚见:
OC中实例对象中只存储数据,数据的解读是需要类对象的,而从实例对象到类对象只是单向的指针,只能单向查找,这就出现个问题,如果运行时动态改变了类对象中成员变量的数量、顺序等,会造成已创建的实例对象的数据解读出错,且因单向指针的问题,没办法动态的添加成员变量后同步的修改已创建的对象;所以在objc_registerClassPair后,类中的部分数据已经编程ReadOnly了,可写的数据都是直接存在类对象中的,比如方法、协议等
js中不存在类的概念,es6中的也只是语法糖而已,函数与属性有相同的数据结构来描述,结构类似于hash表,属性数据的解读不依赖于类对象
JavaScript每个对象都是自描述的,属性和位置偏移信息都包含在自身的结构里。