JavaScript 原型链和继承机制

核心概念

js 中的继承不同于 C++、Java 此类面向对象语言,其继承机制基于原型链。当需要在 js 中使用继承机制时,构造正确的原型链即可实现继承。

js 原型链机制中的各对象之间的关系如上图所示。构造正确的符合继承行为的原型链的关键在于,构造函数的 prototype 属性以及 prototype 的 constructor 属性。

为构造函数构造原型链

1
2
3
4
5
6
function extend(Child, Parent) {
var F = function() {};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
}

为构造函数构造原型链处理的是构造函数,用于实例化出任意多的对象实例。

为对象实例构造原型链

1
2
3
4
5
function object(o) {
function F() {}
F.prototype = o;
return new F();
}

为对象实例构造原型链是一次性的行为,所以 F.prototype.constructor 不需要严格设定。

参考文献

http://www.mollypages.org/tutorials/js.mp

Javascript – How Prototypal Inheritance really works

Javascript面向对象编程(二):构造函数的继承

Javascript面向对象编程(三):非构造函数的继承

视图裁剪

前言

HttpServerDebug 实现了类似 Xcode Debug View Hierarchy 功能。客户端提供信息,前端绘制并提供交互能力,实现视图调试功能。

视图调试其中一项功能是 Show Clipped Content,虽然不知道 Xcode 的实现方式,但是通过计算我们也可以拿到同样的信息。本文说明 HttpServerDebug 中的实现方案。

Read More

Objective-C Block

前言

本文内容主要来自 Pro Multithreading and Memory Management for iOS and OS X with ARC, Grand Central Dispatch, and Blocks 这本书,参考这篇文章

Block 是语言级别的语法,是 C 语言的扩展。Block 可以解释为“包含了局部变量的匿名函数(anonymous functions together with automatic (local) variables)”。本文不多说 Block 的使用方法,着重讨论 Block 的实现机制。

Read More

排序算法,伪代码实现

一、插入排序

1. 直接插入排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 使用插入排序算法,将目标数组从小到大排列
* @param array 待排序的目标数组
* @param n 数组长度
*/
void InsertSort(int array[], int n) {
int i, j;
int tmp;
for (i = 1; i < n; i++) {
// 遍历待排序元素
tmp = array[i];
for (j = i - 1; j >= 0 && array[j] > tmp; j--) {
// 遍历已排序元素
array[j + 1] = array[j];
}
array[j + 1] = tmp;
}
}

时间复杂度 O(n^2),空间复杂度 O(1)。直接插入排序是稳定的排序算法。

Read More

如何在验证失败的情况下发布 Pod

前言

在 CocoaPods 发布 Pod 的最后一步是执行 pod trunk push 命令,pod-trunk 首先会对你创建的 Pod 进行验证,验证通过才允许上传。

有时,希望在 Pod 验证失败的情况下也能够上传,关于这种做法是否合理 这里 有相关讨论。讨论中 @mxcl 给出了一种绕过发布前验证的方法,如下文所述。

正文

pod 命令使用 Ruby 写成,使用解释型语言的好处是我们可以方便的修改命令的逻辑。只要找到目标代码,注释掉验证 Pod 的逻辑便能达到目的。

首先执行 gem env,如下变量给出了 Ruby 库安装的位置。

1
- INSTALLATION DIRECTORY: /usr/local/lib/ruby/gems/2.4.0

当前,pod trunk push 命令文件对于 Ruby 库根目录的相对位置是 gems/cocoapods-trunk-1.3.0/lib/pod/command/trunk/push.rb,只要注释掉如下一行代码即可。

1
2
3
4
5
6
7
8
def run
update_master_repo
# validate_podspec # 删除验证逻辑
status, json = push_to_trunk
update_master_repo

# ...
end