jQueryのDeferredオブジェクトとPromiseオブジェクトの違い

https://api.jquery.com/Types/#Promise
Deferredオブジェクトはresolveが呼び出せるが、Promiseオブジェクトはresolve等を呼び出せない。
つまりpromiseは利用者側が強制的にresolve()を呼び出すといったことを出来なくするためにある。
Deferredは以下のようなことが出来る。

function CreateTimeoutDeffered() {
  var d = $.Deferred();
  setTimeout(() => d.resolve(), 3000);
  return d;
}

var d = CreateTimeoutDeffered()
d.then(() => console.log("3秒経ちました"));

var d = CreateTimeoutDeffered();
d.then(() => console.log("3秒経つまえに強制的に呼び出し"));
d.resolve();

Promiseだとできない。

function CreateTimeoutPromise() {
  var d = $.Deferred();
  setTimeout(() => d.resolve(), 3000);
  return d.promise();
}

var p = CreateTimeoutPromise()
p.then(() => console.log("3秒経ちました"));

var p = CreateTimeoutPromise();
p.then(() => console.log("3秒経つまえに強制的に呼び出し"));
p.resolve(); // promise.resolve()は存在しないのでエラー



ちなみに前述の話は「jQueryのPromiseオブジェクト」の話である。
JavaScriptの標準ビルトインオブジェクトであるPromiseオブジェクトは、resolveを呼び出す仕組みがそもそも違う。

var javascriptPromise = new Promise(resolve => {
  setTimeout(() => resolve(), 3000);
});
javascriptPromise.then(() => console.log("3秒経ちました"));

// やろうと思えば強制呼び出しもできる
var globalResolve;
var javascriptPromise = new Promise(resolve => {
  globalResolve = resolve;
  setTimeout(() => resolve(), 3000);
});
javascriptPromise.then(() => console.log("3秒経ちました"));
globalResolve();